数据结构 ch09学习.pptx
《数据结构 ch09学习.pptx》由会员分享,可在线阅读,更多相关《数据结构 ch09学习.pptx(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/3/251本章学习导读本章学习导读 查找就是在数据集中找出一个查找就是在数据集中找出一个“特定元素特定元素”。在软件设计中,通。在软件设计中,通常是将待查找的数据元素集按照一定的存储结构存入计算机中,变常是将待查找的数据元素集按照一定的存储结构存入计算机中,变为计算机可处理的数据结构,从而构成一种新的数据结构为计算机可处理的数据结构,从而构成一种新的数据结构查找表查找表。9.1 9.1 基本概念基本概念 本章主要系统地讨论了各种查找方法。主要包括线性表的查找、树表的查找和哈希表的查找以及各种查找的性能分析等。通过本章学习,读者应该熟练掌握以下内容:了解查找及查找表的相关概念掌握各种不
2、同的查找表的查找算法和性能分析 掌握哈希表的各种构造方法、冲突处理和性能分析 第1页/共84页2023/3/252 查找表是记录的集合,每个记录至少包含一个查找表是记录的集合,每个记录至少包含一个关键字关键字。所谓查找就是。所谓查找就是根据给定的关键字值,在查找表中找出一个记录,该记录的关键字值等根据给定的关键字值,在查找表中找出一个记录,该记录的关键字值等于给定的值。于给定的值。若在查找的同时对表做修改运算(如插入和删除),则相应的表称若在查找的同时对表做修改运算(如插入和删除),则相应的表称之为之为动态查找表动态查找表,否则称之为,否则称之为静态查找表静态查找表。由由于于查查找找表表的的范
3、范围围和和给给定定的的关关键键字字值值的的不不同同,查查找找有有两两种种可可能能的的结结果果:一一种种是是找找到到了了相相应应的的记记录录,称称为为查查找找成成功功。通通常常要要求求返返回回该该记记录录的的存存储储位位置置,以以便便对对该该记记录录作作进进一一步步处处理理;一一种种是是找找不不到到相相应应的的记记录录,称称为为查查找失败找失败。此时应返回一个能表示查找失败的值。此时应返回一个能表示查找失败的值。采采用用何何种种查查找找方方法法,取取决决于于使使用用哪哪种种数数据据结结构构来来表表示示“表表”。即即表表中中记记录是按何种方式组织的,根据不同的数据结构采用不同的查找方法。录是按何种
4、方式组织的,根据不同的数据结构采用不同的查找方法。第2页/共84页2023/3/253 查找算法中的基本运算是记录的关键字与给定值所进行的比较。其执行时间通查找算法中的基本运算是记录的关键字与给定值所进行的比较。其执行时间通常取决于关键字的比较次数,也称为常取决于关键字的比较次数,也称为平均查找长度平均查找长度。比较次数的多少就是相应算法。比较次数的多少就是相应算法的时间复杂度,它是衡量一个查找算法优劣的重要指标。平均查找长度的时间复杂度,它是衡量一个查找算法优劣的重要指标。平均查找长度ASLASL定义为:定义为:n n 是查找表中记录的个数是查找表中记录的个数P Pi i 是查找第是查找第i
5、 i个记录的概率个记录的概率C Ci i 是找到第是找到第i i个记录所需进行的比较次数。个记录所需进行的比较次数。第3页/共84页2023/3/2549.2 9.2 顺序表的静态查找顺序表的静态查找定义被查找的顺序表类型定义如下定义被查找的顺序表类型定义如下:#define MAXLEN define MAXLEN typedef structtypedef struct KeyType key;/KeyType KeyType key;/KeyType为关键字的数据类型为关键字的数据类型 infoType data;/infoType data;/其他数据其他数据 SeqList;SeqL
6、ist;在顺序表中的查找,根据元素之间是否具有递增(减)特性又可分为三种情况:简单顺序查找、二分查找和分块有序查找。各种情况的查找方法及其性能存在较大差异。第4页/共84页2023/3/2559.2.1 9.2.1 简单顺序查找简单顺序查找 基基本本思思想想是是:从从表表的的一一端端开开始始,逐逐个个把把每每条条记记录录的的关关键键字字值值与与给给定定值值k k进进行行比比较较。若若某某个个记记录录关关键键字字值值与与给给定定值值k k相相等等,则则查查找找成成功功,返返回回找找到到的的记记录录位位置置。反反之之,若若已已查查找找到到表表的的另另一一端端,仍仍未未找找到到关关键键字字值值与与给
7、给定定值值相相等等的的记记录录,则则查查找找不不成成功,返回功,返回-1-1。Typedef int KeyType;int SeqSearch(SeqList A,int n,KeyType k)int i;int find=0;for(i=0;in;i+)if(Ai.key=k)find=1;break;return(find?i:-1);第5页/共84页2023/3/256算法分析 从顺序查找过程可见(不考虑越界比较),顺序查找不论给定值k k为何,若第1 1个记录符合给定值,只要比较1 1次。若第n n个记录符合给定值,要比较n n次,即ci=ici=i。若每个记录的查找概率相等,且每
8、次查找都是成功的。则在等概率的情况下,顺序查找的平均查找长度为:查找成功时的平均比较次数约为表长的一半。若k k值不在表中,则须进行n+1n+1次比较之后才能确定查找失败。顺序查找算法的时间复杂性为O(n)O(n)。第6页/共84页2023/3/2579.2.2 9.2.2 二分查找二分查找 二二分分查查找找的的基基本本思思想想是是:首首先先确确定定待待查查记记录录所所在在的的范范围围(区区域域)。假假设设用用变变量量lowlow和和highhigh分分别别表表示示当当前前查查找找区区域域的的首首尾尾下下标标。将将待待查查关关键键字字k k和和该该区区域域的的中中间间元元素素,其其下下标标为为
9、mid=(low+high)mid=(low+high)2 2的的关关键键字字进进行行比比较较。比比较较的结果有如下三种情况:的结果有如下三种情况:(1 1)k=Amid.keyk=Amid.key:查找成功,返回查找成功,返回midmid的值。的值。(2 2)kAmid.keykAmid.keykAmid.key:说说明明元元素素只只可可能能在在右右边边区区域域(下下标标从从mid+1mid+1到到highhigh)。因此应在此区域继续取中间位置记录的关键字进行比较。因此应在此区域继续取中间位置记录的关键字进行比较。第7页/共84页2023/3/258int BinSearch(SeqLis
10、t A,int n,KeyType k)int low=0,high=n-1,mid;while(lowk)high=mid-1;else low=high+1;return-1;第8页/共84页2023/3/259有序表中关键字为(10,15,18,20,26,28,33,36,38,43,49),查找18的示意图。第9页/共84页2023/3/2510有序表中关键字为(10,15,18,20,26,28,33,36,38,43,49),查找39的示意图。第10页/共84页2023/3/2511算法分析 二分查找算法的计算复杂性可以用二叉树来进行分析。我们把当前查找区间的中间位置上的记录作为
11、根。左子表和右子表中的记录分别作为根的左子树和右子树。由此得到的二叉树,称为描述二分查找的判定树判定树或比较树比较树。具有11个记录的有序表可用右图所示的判定树来表示。树中每个结点表示一个记录,结点的编号为该记录在表中的位置。找到一个记录的过程就是走了一条从根结点到与该记录结点的路径。和给定值进行比较的次数正好是该结点所在的层次数。二分查找在查找成功时和给定值进行比较的关键字的个数至多为log2n+1。同理,查找不成功的过程也是走了一条从根结点到某一个终端结点的路径,其所用的比较次数等于树的深度。第11页/共84页2023/3/2512 在查找概率相同的情况下,Pi=1/nPi=1/n。查找成
12、功的平均查找长度为:二分查找算法比顺序查找算法平均查找长度为 n/2的比较次数少,查找速度快。虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算,即使采用高效率的排序方法也要花费O(nlog2n)的时间。另外,二分查找只适用顺序存储结构,不适于线性链表结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的记录。二分查找特别适用于那种一经建立就很少改动,而又经常需要查找的线性表。第12页/共84页2023/3/25139.2.3 9.2.3 分块查找分块查找 基基本本思思想想是是:首首先先把把表表长长为为n n的的线线性性表表分分成成b b块块,前前b-1b-1块
13、块记记录录个个数数为为s=n/bs=n/b,第第b b块块的的记记录录个个数数小小于于等等于于s s。在在每每一一块块中中,结结点点的的存存放放不不一一定定有有序序,但但块块与与块块之之间间必必须须是是分分块块有有序序的的(假假定定按按结结点点的的关关键键字字值值递递增增有有序序)。即即指指后后一一个个块块中中所所有有记记录录的的关关键键字字值值都都应应比比前前一一个个块块中中所所有有记记录录的的关关键键字字值值大大。为为实实现现分分块块检检索索,还还需需建建立立一一个个索索引引表表。索索引引表表的的每每个个元元素素对对应应一一个个块块,其其中中包包括括该该块块内内最最大大关关键键字字值值和和
14、块块中中第第一个记录位置的地址指针。显然这个索引顺序表是一个递增有序表。一个记录位置的地址指针。显然这个索引顺序表是一个递增有序表。第13页/共84页2023/3/2514 分块有序表的索引存储表示 第14页/共84页2023/3/2515索引表结点的数据类型定义如下:#define MaxIndex typedef struct KeyType key;int link;IdxType;在这种结构下,查找过程要分为两步:首先查找索引表。因为索引表是有序表,所以可采用二分查找或顺序查找,以确定给定值所在的块。因为块中的记录可以是任意排列的,所以再在已确定的块中进行顺序查找。第15页/共84页2
15、023/3/2516分块查找算法如下:int IdxSerch(SeqList A,IdxType index,int b,KeyType k,int n)/分块查找关键字为k的记录,索引表为index0.b-1 int low=0,high=b-1,mid,i;int s=n/b;/每块记录个数 while(low=high)/在索引表中进行二分查找,找到的位置放在low中 mid=(low+high)/2;if(indexmid.keyk)low=mid+1 else high=mid-1;if(lowb)/在顺序表中顺序查找 for(i=indexlow.link;i=indexlow.
16、link+s-1&ikey=k)return;/树中已有k,无须插入 f=p;/f保存当前查找的记录 if(p-keyk)p=p-lchild;else p=p-rchild;p=(BsTree*)malloc(sizeof(BsTree);p-key=k;p-lchild=p-rchild=NULL;/创建一个新记录 if(*BST=NULL)*BST=p;/原树为空,新插入的记录为新的根 else if(kkey)f-lchild=p;/原树非空时将*p作为*f的左孩子插入 else f-rchild=p;第21页/共84页2023/3/25222二叉排序树的查找基本思想是:(1)当二叉树
17、为空树时,检索失败。(2)如果二叉排序树根结点的关键字等于待检索的关键字,则检索成功。(3)如果二叉排序树根结点的关键字小于待检索的关键字,则在根结点的右子树中用相同的方法继续检索。(4)如果二叉排序树根结点的关键字大于待检索的关键字,则在根结点的左子树中用相同的方法继续检索。第22页/共84页2023/3/2523非递归算法:BsTree*BstSeareh(BsTree*BST,KeyType k,BsTree*parent)BsTree*p=BST,*q=NULL;/p指向根结点,q指向*p的双亲结点 while(p!=NULL)if(k=p-key)/查找成功 *parent=q;re
18、turn(p);q=p;if(kkey)p=p-lchild;/在左子树中查找 else p=p-rchild;/在右子树中查找 *parent=q;return(p);/查找失败,返回空 第23页/共84页2023/3/25243二叉排序树的删除 基本思想是:(1)若待删除的结点是叶结点,直接删去该结点。(2)若待删除的结点只有左子树而无右子树。根据二叉排序树的特点,可以直接将其左子树的根结点放在被删结点的位置。(3)若待删除的结点只有右子树而无左子树。与(2)情况类似,可以直接将其右子树的根结点放在被删结点的位置。(4)若待删除的结点同时有左子树和右子树。根据二叉排序树的特点,可以从其左子
19、树中选择关键字最大的结点或右子树中选择关键字最小的结点放在被删去结点的位置上。假如选取右子树上关键字最小的结点,那么该结点一定是右子树的最左结点。第24页/共84页2023/3/2525第25页/共84页2023/3/2526第26页/共84页2023/3/2527void DelBstree(BsTree*BST,KeyType k)BsTree*p,*q,*s,*r;q=BstSearch(*BST,k,&p);if(q)/查找成功 if(q-lchild=NULL&q-rchild=NULL)/待删除的是叶子结点 if(p)/待删除结点有双亲 if(p-lchild=q)p-lchild
20、=NULL;else p-rchild=NULL;else*BST=NULL;/原来的树只有一个根结点 /不是叶子结点,且待删除结点的左子树为空 else if(q-lchild=NULL)if(p)if(p-lchild=q)p-lchild=q-rchild;else p-rchild=q-rchild;else*BST=q-rchild;else if(q-rchild=NULL)/待删除结点的右子树为空 用C语言描述的在二叉排序树中删除结点的算法如下:第27页/共84页2023/3/2528 if(p)if(p-lchild=q)p-lchild=q-lchild;else p-rch
21、ild=q-lchild;else*BST=q-lchild;else s=q;r=s-rchild;while(r-lchild!=NULL)/找右子树关键字值最小的结点 s=r;r=r-lchild;r-lchild=q-lchild;/把待删除结点的左子树做为*r的左子树 if(q!=s)s-lchild=r-rchild;/把*r的右子树做为其父结点*s的左子树 r-rchild=q-rchild;/把待删除结点的右子树做为*r的右子树 if(p)/待删除结点有父结点 if(p-lchild=q)p-lchild=r;else p-rchild=r;else*BST=r;free(q)
22、;第28页/共84页2023/3/2529二叉排序树查找算法分析 在二叉排序树上查找其关键字等于给定值的结点的过程,恰是走了一条从根结点到该结点的路径的过程。和给定值比较的关键字次数等于路径长度加1 1(或结点所在层次数)。含有n n个结点的二叉排序树并不唯一,其平均查找长度和树的形态有关。例如,(a)图和(b)图是结点数为6 6的两棵二叉排序树。(a)图中树的深度为3 3,而(b)图树的深度为6 6。第29页/共84页2023/3/2530 从平均查找长度分析,假设6 6个记录的查找概率相等,即为1 16 6。则图(a)a)树的平均查找长度为:而图(b)树的平均查找长度为:当表中记录按关键字
23、有序时,构成的二叉排序树蜕变 为 歪 斜 树。树 的 深 度 为 n n,其 平 均 查 找 长 度 为(n+1)/2n+1)/2(和顺序查找相同),这是最差的情况。显然,最好情况下平均查找长度和loglog2 2n n成正比。为了避免出现歪斜树,在构造二叉排序树的过程中需要不断进行平衡处理,使其成为平衡二叉树。第30页/共84页2023/3/25319.3.2 9.3.2 平衡二叉树平衡二叉树 平衡二叉树或是一棵空树,或是具有下列性质的二叉排序树:(1)它的左子树和左子树的深度之差的绝对值不超过1。(2)它的左、右子树都是平衡二叉树。1.平衡二叉树和不平衡二叉树 第31页/共84页2023/
24、3/2532 在算法中,通过平衡因子来具体实现上述平衡二叉树的定义。平衡二叉树中每个结点设有一个平衡因子域,其中存放的是该结点的左子树深度减去右子树深度的值,称为该结点的平衡因子。从平衡因子的角度可以说,若一棵二叉树中所有结点的平衡因子取值均为1、0或-l,则该二叉树称为平衡二叉树。第32页/共84页2023/3/25332平衡二叉树的调整 若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二
25、叉排序树就又成为一棵平衡二叉树。失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。第33页/共84页2023/3/2534(1)LL型平衡旋转法 由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。第34页/共84页2023/3/2535(2)RR型平衡旋转法 由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 ch09学习 ch09 学习
限制150内