数据结构案例教程(CC++版)第2版 课件 第8章 查找_第1页
数据结构案例教程(CC++版)第2版 课件 第8章 查找_第2页
数据结构案例教程(CC++版)第2版 课件 第8章 查找_第3页
数据结构案例教程(CC++版)第2版 课件 第8章 查找_第4页
数据结构案例教程(CC++版)第2版 课件 第8章 查找_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章查找人们在日常生活中经常需要查找某个人或某个单位的电话号码,要求实现一个简单的通讯录查询系统,根据用户输入的信息(例如姓名)进行快速查询。计算机的出现使信息查询更加快捷、方便、准确。导学问题:8.1知识学习——查找的基本概念

查找的术语查找表。由具有同一类型的数据元素(或记录)组成的集合。关键字。是记录中某个项或组合项的值,用它可以标识一个记录。能唯一确定一个记录的关键字,称为主关键字;而不能唯一确定一个记录的关键字,称为次关键字。查找。是指按给定的某个值k,在查找表中查找关键字为给定值k的记录。

8.1知识学习——查找的基本概念

查找算法的性能查找算法时间性能通过关键码的比较次数来度量。关键码的比较次数与哪些因素有关呢?⑴算法;⑵问题规模;⑶待查关键码在查找集合中的位置;⑷查找频率。查找频率与算法无关,取决于具体应用。8.1知识学习——查找的基本概念

查找算法的性能平均查找长度:查找算法进行的关键码的比较次数的数学期望值。计算公式为:其中:n:问题规模,查找集合中的记录个数;

pi:查找第i个记录的概率;ci:查找第i个记录所需的关键码的比较次数。结论:ci取决于算法;pi与算法无关,取决于具体应用。如果pi是已知的,则平均查找长度只是问题规模的函数。ASLå==niiicp18.1知识学习——查找的基本概念

查找技术静态查找

:不涉及插入和删除操作的查找。静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作,或经过一段时间的查找之后,集中地进行插入和删除等修改操作;动态查找:涉及插入和删除操作的查找。动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。8.1知识学习8.1.2顺序表查找1)顺序查找

基本思想:从线性表的一端向另一端逐个将关键码与给定值进行比较,若相等,则查找成功,给出该记录在表中的位置;若整个表检测完仍未找到与给定值相等的关键码,则查找失败,给出失败信息。intSeqSearch(intr[],intn,intk){ inti=0; while(i<n&&r[i]!=k)

i++; if(i<n)returni; elsereturn-1;}基本思想:设置“哨兵”。哨兵就是待查值,将它放在查找方向的尽头处,免去了在查找过程中每一次比较后都要判断查找位置是否越界,从而提高查找速度。101524612354098550123456789i例:查找k=35iii哨兵35查找方向改进的顺序查找

intSeqSearch2(intr[],intn,intk){ inti=0;

r[n]=k;

while(r[i]!=k) i++; if(i<n)returni; elsereturn-1;}

ASL==å=niicp1å+-=niiinp1)1(i=(n+1)/2=O(n)改进的顺序查找顺序查找的缺点:平均查找长度较大,特别是当待查找集合中元素较多时,查找效率较低。顺序查找的优点:算法简单而且使用面广。对表中记录的存储没有任何要求,顺序存储和链接存储均可;对表中记录的有序性也没有要求,无论记录是否按关键码有序均可。8.1.2顺序表查找2)折半查找使用条件:线性表中的记录必须按关键码有序;必须采用顺序存储。基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半区继续查找;若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。例:查找值为23的过程low=0high=13mid=6

high=5mid=2

32>2319<2301234567891011125131921232932353742464956low=0low=3high=5mid=4

23=23例:查找值为23的过程low=0high=13mid=6

high=5mid=2

32>2219<2201234567891011125131921232932353742464956low=0low=3high=5mid=4

mid=3

23>22low=3high=321<22low=4high=3Low>highintBiSearch(intr[],intn,intk){

intlow=0,high=n-1,mid; while(low<=high) { mid=(low+high)/2; if(r[mid]==k)returnmid; elseif(r[mid]<k)low=mid+1; elsehigh=mid-1; } return-1;}

折半查找——非递归

intBiSearch2(intr[],intlow,inthigh,intk){ intmid;if(low>high) return-1; else { mid=(low+high)/2; if(r[mid]==k) returnmid; else if(r[mid]<k) returnBiSearch2(r,mid+1,high,k); else returnBiSearch2(r,low,mid-1,k); }}

折半查找——递归

折半查找的判定树判定树:折半查找的过程可以用二叉树来描述,树中的每个结点对应有序表中的一个记录,结点的值为该记录在表中的位置。通常称这个描述折半查找过程的二叉树为折半查找判定树,简称二叉判定树。折半查找的判定树判定树的构造方法⑴当n=0时,折半查找判定树为空;⑵当n>0时,折半查找判定树的根结点是有序表中序号为mid=(n+1)/2的记录,根结点的左子树是与有序表r[1]~r[mid-1]相对应的折半查找判定树,根结点的右子树是与r[mid+1]~r[n]相对应的折半查找判定树。-11-22-33-44-510-1111-9-108-97-85-66-7内部结点外部结点3691011784512折半查找的判定树具有n个结点的折半查找判定树的深度为查找成功:在表中查找任一记录的过程,即是折半查找判定树中从根结点到该记录结点的路径,和给定值的比较次数等于该记录结点在树中的层数。查找不成功:查找失败的过程就是走了一条从根结点到外部结点的路径,和给定值进行的关键码的比较次数等于该路径上内部结点的个数。。ëû1log2+n折半查找的性能分析设有序顺序表中的元素依次为017,094,154,170,275,503,509,512,553,612,677,765,897,908。试画出对其进行折半搜索时的二叉判定树,并计算搜索成功的平均搜索长度和搜索不成功的平均搜索长度。练习设有序顺序表中的元素依次为017,094,154,170,275,503,509,512,553,612,677,765,897,908。试画出对其进行折半搜索时的二叉判定树,并计算搜索成功的平均搜索长度和搜索不成功的平均搜索长度。练习8.1.2顺序表查找如何提高大数据表的查找效率是一个重要的研究内容。对于拥有大量数据甚至海量数据的数据表,采用顺序查找的效率很难适应实际需求,即使采用折半查找,时间复杂度仍然达到O(log2n),而且还要求数据表有序。8.1.2顺序表查找想一想我们是如何在厚重的英语或汉语词典中查找一个单词的。我们通常是根据待查单词的首字母,利用词典边缘的索引(26个英文字母),快速定位到单词所在的区间,然后在这个较小的区间中再逐步查找的。8.1.2顺序表查找3)分块查找生活中这种利用索引查找单词的方法可以运用于数据表的查找,称之为分块查找,或称为分块索引查找,该方法适用于对关键字分块有序的查找表进行查找操作。8.1.2顺序表查找所谓分块有序是指查找表可按关键字大小分成若干子表(或称块),且前一块中的最大关键字小于后一块中的最小关键字,但是各块内部的关键字不一定有序。分块查找需对子表建立索引表,查找表的每一个子表由索引表中的索引项确定。索引项包括两个字段:关键字字段(存放对应子表中的最大关键字值)和指针字段(存放子表的起始序号)。8.1.2顺序表查找分块查找过程分两步进行:①确定要查找的记录所在的子表。用给定值k在索引表中查找索引项,以确定要查找的记录位于哪个子表中。②确定要查找的记录的情况。对第①步确定的子表进行顺序查找,以确定要查找的记录的情况。8.1.2顺序表查找查找38的过程在索引表顺序查找在子表顺序查找索引表通常有序,可以折半查找分块查找的效率介于顺序查找和折半查找之间分块查找的进一步讨论:进一步地,再想一想翻阅字典时的情形。在利用词典边缘的字母索引来确定单词的起始查找位置时,我们一般不会严格按照折半查找的方式来确定,而是这样一个过程:如果所要查找的单词按照字母次序比已经翻开的页面上的字大很多,就多翻几页来看下一个页面;否则就往前多翻几页来查看。可以把这种方法描述成这样的计算机算法:当知道关键字k位于kl和kh之间时,下一次探测的位置可以选在

(k-kl)/(kh-kl)这个点上。这个算法在关键字以基本均匀的速度增加的情况下,可以比折半查找更快地接近要查找的位置。折半查找中的每一步把查找工作量从n降到n/2,该查找方法则可以把查找工作量从n降到

。8.1.3树表查找1)二叉排序树二叉排序树(也称二叉查找树):或者是一棵空的二叉树,或者是具有下列性质的二叉树:⑴若它的左子树不空,则左子树上所有结点的值均小于根结点的值;⑵若它的右子树不空,则右子树上所有结点的值均大于根结点的值;⑶它的左右子树也都是二叉排序树。二叉排序树的定义采用的是递归方法。二叉排序树非二叉排序树6390554258104567837063605582581045678370中序遍历二叉排序树可以得到一个按关键码有序的序列二叉排序树设有一个输入数据的序列是{46,25,78,62,12,37,70,29},试画出从空树起,逐个输入各个数据而生成的二叉排序树。

练习二叉排序树的存储结构假设二叉排序树中结点的数据域只含一个整型数据,类型定义如下:typedefstructBiNode{ intkey; structBiNode*lchild,*rchild;}*BiSortTree;二叉排序树的插入在一棵二叉排序树中插入值为k的结点,步骤如下:①若二叉排序树为空,则生成值为k的新结点,同时将新结点s作为根结点插入。②若k小于根结点的值,则在根的左子树中插入值为k的结点。③若k大于根结点的值,则在根的右子树中插入值为k的结点。④若k等于根结点的值,表明二叉排序树中已有此关键字,则无须插入。从以上描述可知,插入过程是递归的。例:插入值为98的结点6355905870985563root∧9058∧∧70∧∧98∧∧sroot∧voidInsert(BiSortTree&T,intk){ if(T==NULL) { T=newBiNode; T->key=k; T->lchild=T->rchild=NULL; } elseif(k<T->key) Insert(T->lchild,k); else Insert(T->rchild,k);}二叉排序树的插入算法二叉排序树的构造从空的二叉排序树开始,依次插入一个个结点。例:关键码集合为{63,90,70,55,58},二叉排序树的构造过程为:

6355905870voidCreateBiSortTree(BiSortTree&T,inta[],intn){ inti; for(i=0;i<n;i++) Insert(T,a[i]);}

二叉排序树的建立算法在二叉排序树中查找给定值k的过程是:①若二叉排序树为空,则表明查找失败,返回空指针;否则,若给定值k等于根结点的值,则表明查找成功,返回根结点;②若给定值k小于根结点的值,则继续在根的左子树中查找;③若给定值k大于根结点的值,则继续在根的右子树中查找。这是一个递归查找过程。二叉排序树的查找例:在二叉排序树中查找关键字值为35,95的过程:50302080908588403532二叉排序树的查找50302080908588403532BiSortTreeBST_Search(BiSortTreeT,intk){ if(T==NULL) returnNULL; elseif(k==T->key) returnT; elseif(k<T->key) returnBST_Search(T->lchild,k); else returnBST_Search(T->rchild,k);}二叉排序树的查找二叉排序树的查找性能分析由序列{3,1,2,5,4}得到二叉排序树:由序列{1,2,3,4,5}得到二叉排序树:ASL=(1+2+3+4+5)/5=3ASL=(1+2+3+2+3)/5=2.2二叉排序树的查找性能取决于二叉排序树的形状,在O(log2n)和O(n)之间。

1234531254二叉排序树的删除在二叉排序树上删除某个结点之后,仍然保持二叉排序树的特性。分三种情况讨论:被删除的结点是叶子;被删除的结点是单支结点(只有左子树或者只有右子树);被删除的结点是双支结点(既有左子树,也有右子树)。情况1——被删除的结点是叶子结点50302080908588403532503020809085403532操作:将双亲结点中相应指针域的值改为空。情况2——被删除的结点是单支结点操作:将双亲结点的相应指针域的值指向被删除结点的左子树(或右子树)。50302080908588403532503020908588403532情况3——被删除的结点是双支结点操作:以其前驱(左子树中的最大值)替代之,然后再删除该前驱结点。5030208090858840353240302080908588353240删除二叉排序树的删除算法(递归)①若二叉排序树为空,则表明不存在删除的结点,不进行删除操作。②若给定值k小于根结点的值,则继续在根的左子树中删除。③若给定值k大于根结点的值,则继续在根的右子树中删除。④若给定值k等于根结点的值,则根结点即为要删除的结点,此时需要根据上述分析的三种结点情况:叶子结点、单支结点或双支结点,执行相应的删除操作。平衡二叉树平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:⑴根结点的左子树和右子树的深度最多相差1;⑵根结点的左子树和右子树也都是平衡二叉树。平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。548254821是平衡树非平衡树在平衡树中,结点的平衡因子可以是1,0,-1。结点的平衡因子=HL-HR平衡二叉树基本思想:在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入而破坏了树的平衡性,若是,在保持二叉排序树特性的前提下,调整各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。平衡二叉树的构造平衡二叉树的构造设结点A为最小不平衡子树的根结点,对该子树进行平衡调整归纳起来有以下四种情况:1.LL型2.RR型3.LR型4.RL型练习:设有关键码序列{4,5,7,2,1,3,6},构造平衡二叉树练习:设有关键码序列{4,5,7,2,1,3,6},构造平衡二叉树练习:设有关键码序列{4,5,7,2,1,3,6},构造平衡二叉树B树B树的B即Balanced,平衡的意思。从字面意思可知B树是平衡二叉树的延伸。B树属于动态的多级索引,是一种平衡的多路查找树,它在文件系统中很有用。B树定义:一棵m阶的B树,或者为空树,或为满足下列特性的m叉树:(1)树中叶子结点的说明:所有的叶子结点都出现在同一层上,并且不带信息,这些结点可以看作是外部结点或查找失败的结点因为叶子结点实际不存在,所以叶子结点可以不画出,后续的图例中不再出现叶子结点。B树(2)树中关键字的要求:根结点中至少有一个关键字,最多有m-1个关键字;非根非叶子结点中包含

m/2

1~m

1个关键字,且这些关键字升序存放;非叶子结点存储的关键字对存储在其各个子树中的关键字范围进行分割;所有关键字在整棵树中出现且仅出现一次。该5阶B树中,根结点中的关键字个数最少为1,最多为m

1=4每个非根非叶子结点的关键字个数最少为

m/2

1=

5/2

1=2,最多为m

1=4B树(3)树中子树的要求:每个非叶子结点有比其包含的关键字个数多一个的指向孩子的指针,叶子结点没有孩子指针;每个结点至多有m棵子树;根结点至少有两棵子树;非根非叶子结点至少有

m/2

棵子树。该5阶B树中,根结点的子树个数最少为2,最多为m=5每个非根非叶子结点的子树个数最少为3,最多为5B树B树的查找:B树的查找类似二叉排序树的查找,不同之处在于B树每个结点上是多关键字的有序表。在到达某个结点时,先在该结点的有序表中查找。若找到,则查找成功;否则,再到对应的指针指向的子树中去查找,当到达叶子结点时,则说明树中没有对应的关键字,查找失败。即B树上的查找过程是由两个基本操作交叉进行的过程:①在B树上找结点;②在结点中找关键字。B树例如,在图中查找关键字值为93的元素。首先,从r指向的根结点a开始,结点a中只有一个关键字,且93大于它因此,按a结点第2个指针到结点c去查找,结点c有两个关键字,而93也都大于它们应按c结点第3个指针到结点i去查找,在结点i中顺序比较关键字,找到关键字93。B树由于B树通常是存储在外存上的,因此上述查找过程中的操作①就是通过指针在磁盘相对定位,将结点信息读入内存,之后再对结点中的关键字有序表进行顺序查找或折半查找。因为在磁盘上读取结点信息比在内存中进行关键字查找耗时多,所以在磁盘上读取结点信息的次数,即B树的高度是决定B树查找效率的首要因素。在含有n个关键字的B树上进行查找时,从根结点到关键字所在结点的路径上涉及的结点数不超过

B树B树的插入和删除操作(1)插入操作同二叉排序树一样,关键字的插入次序不同,将可能生成不同结构的B树。在B树上插入关键字与在二叉排序树上插入结点不同,关键字的插入不是在叶结点上进行,而是在最低层的某个结点中添加一个关键字。若该结点上关键字个数不超过m

1个,则可直接插入到该结点上;否则,该结点上关键字个数达到m个,使该结点的子树超过了m棵,这与B树定义不符,所以要调整,即进行结点的分裂。B树(1)插入操作分裂的方法是:关键字加入结点后,将结点中的关键字分成三部分,使得前后两部分关键字个数均大于等于

m/2

1,而中间部分只有一个结点。前后两部分成为两个结点,中间的一个结点插入到父结点中。若插入父结点而使父结点中关键字个数超过m

1,则父结点继续分裂,直到插入某个父结点后,其关键字个数小于m。可见,B树是从底向上生长的。B树例

在一棵3阶B树上依次插入关键字65、24、50和38

B树(2)删除操作1)删除底层结点中的关键字。这里又分3种情形处理①若结点中关键字个数大于

m/2

1,直接删去。②若余项与右兄弟(无右兄弟,则找左兄弟)项数之和大于等于2(

m/2

1)就与它们父结点中的有关项一起重新分配。③若删除后,余项与右兄弟或左兄弟关键字个数之和均小于2(

m/2

1),就将余项与右兄弟或左兄弟合并。由于两个结点合并后,父结点中相关项不能满足B树要求,则继续调整,直到根结点。B树例在如图所示的5阶B树中分别删除76和7B树(2)删除操作2)删除非底层结点中的关键字。若删除非底层结点中的关键字K,则以该关键字相关联指针所指子树中的最小关键字X与K交换,问题转换为在下一层结点中再删除关键字K,直到这个K在最底层结点上,即转为情形1)。B树例在如图所示的5阶B树中删除26B+树B+树是应文件系统所需而产生的一种B树的变形树。一棵m阶的B+树和m阶的B树的差异在于:(1)在B树中,每个结点含n个关键字,n+1棵子树;

在B+树中,每个结点含n个关键字,n棵子树。(2)在B树中,每个结点中关键字个数n的取值范围

m/2

1≤n≤m

1(除根)结点外。

在B+树中,每个结点中关键字个数n的取值范围

m/2

≤n≤m(除根结点外),1≤n≤m(根结点)。(3)B+树中所有底层结点包含了全部关键字及指向对应记录的指针,且所有底层结点按关键字由小到大顺序依次链接。(4)B+树中所有非底层结点仅起索引作用,结点中仅含有其子树中的最大(或最小)关键字。B+树在B+树上进行随机查找、插入和删除的过程基本上与B树类似。不同之处在于在查找时,若非底层结点上的关键字等于给定值,并不终止,而是继续向下直到底层结点。因此,在B+树中,不论查找成功与否,每次查找都是走了一条从根到底层结点的路径。B+树查找效率的分析类似于B树。B+树B+树的插入仅在底层结点上进行,当结点中的关键字个数大于m时要分裂成两个结点,他们所含关键字的个数均为

(m+1)/2

。并且,他们的双亲结点中应同时包含这两个结点中的最大关键字。B+树的删除也仅在底层结点进行,当底层结点中的最大关键字被删除时,其在非底层结点中的值可以作为一个分界关键字存在。若因删除而使结点中关键字的个数少于

m/2

时,其和兄弟结点的合并过程亦和B树类似。B+树例在如图所示的3阶B+树中依次插入关键字16、17、198.2知识应用为了实现对电话号码的快速查询,可以将通讯录存储到元素类型为结构体的顺序表中,然后按姓名排序,以便应用折半查找,但是排序代价较高。且通讯录是动态的,会经常进行插入和删除操作,因此可考虑采用二叉排序树的结构存储通讯录信息,则查找和维护都能获得较高的时间性能。8.3知识拓展以上讨论的查找方法,由于记录的存储位置与关键字之间不存在确定的关系,因此,查找时需要进行一系列对关键字的查找比较,即“查找算法”是建立在比较的基础上的,查找效率由比较一次缩小的查找范围决定。以上介绍的算法是否对任何情况都适合呢?处理在海量数据中查找时,能否表现出较好的性能?能否不用比较,通过关键码直接确定存储位置?理想的情况是,依据关键字直接得到其对应的记录位置,即要求关键字与记录位置间存在一一对应关系,通过这个关系,能很快地由关键字得到对应的记录位置。

Hash查找查找操作要完成什么任务?我们学过哪些查找技术?这些查找技术的共性?顺序查找、折半查找、二叉排序树查找等。以上讨论的查找方法,由于记录的存储位置与关键字之间不存在确定的关系,因此查找时需要进行一系列对关键字的查找比较,即“查找算法”是建立在比较的基础上的,查找效率由比较一次缩小的查找范围决定。

待查值k确定k在存储结构中的位置散列技术仅仅是一种查找技术吗?散列既是一种查找技术,也是一种存储技术。散列是一种完整的存储结构吗?散列只是通过记录的关键码定位该记录,没有完整地表达记录之间的逻辑关系,所以,散列主要是面向查找的存储结构。散列技术适合于哪种类型的查找?散列技术一般不适用于允许多个记录有同样关键码的情况。散列方法也不适用于范围查找,换言之,在散列表中,我们不可能找到最大或最小关键码的记录,也不可能找到在某一范围内的记录。散列技术的关键问题:⑴散列函数的设计。如何设计一个简单、均匀、存储利用率高的散列函数。①所选函数尽可能简单,以便提高转换速度。②所选函数对关键字计算出的地址,应在Hash地址集中大致均匀分布,以尽量减少冲突。散列技术的关键问题:⑵冲突的处理。如何采取合适的处理冲突方法来解决冲突。①Hash函数。若Hash函数选择得当,就可使Hash地址尽可能均匀地分布在Hash地址空间上,从而减少冲突的发生;否则,若Hash函数选择不当,就可能使Hash地址集中于某些区域,从而加大冲突的发生。②处理冲突的方法。选择适当的Hash函数可以减少冲突,但不能避免冲突,因此当冲突发生时,必须有较好的处理冲突的方法。③Hash表的装填因子。散列函数是关键码的线性函数,即:H(key)=a

key+b(a,b为常数)例:关键码集合为{10,30,50,70,80,90},选取的散列函数为H(key)=key/10,则散列表为:0123456789103050708090适用情况?事先知道关键码,关键码集合不是很大且连续性较好。散列函数——直接定址法散列函数为:H(key)=keymodp

1470147014散列地址56494235282114关键码如何选取合适的p,产生较少冲突?例:p=21=3×7散列函数——除留余数法若p取偶数时,偶数的关键字将映射到Hash表的偶数地址,奇数的关键字将映射到Hash表的奇数地址,从而增加了冲突的可能;若p含有质因子即p=mn,则所有含有m或n因子的关键字的Hash地址均为m或n的倍数,这也会增加冲突的可能性。根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成散列地址。

例:关键码为8位十进制数,散列地址为2位十进制数81346

5

3

281372

2

4281387

4

2281301

3

6781322

8

1781338

9

67①②③④⑤⑥⑦⑧散

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论