数据结构第7章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构第7章课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件
- 资源描述:
-
1、第第7 7章章 查找表查找表2022年8月3日星期三本章概述本章概述 “查找查找”是日常生活中常有的事,人们几乎每天都是日常生活中常有的事,人们几乎每天都要做要做“查找查找”工作。例如,在电话号码簿中查找某单工作。例如,在电话号码簿中查找某单位或某人的电话号码;在阅读文献时查阅字典以确定位或某人的电话号码;在阅读文献时查阅字典以确定某个词的含义;在程序设计中,查找也是一种常用的某个词的含义;在程序设计中,查找也是一种常用的基本运算,如编译程序中符号表的查找、信息处理系基本运算,如编译程序中符号表的查找、信息处理系统中信息的查找等。因此,如何高效率地实现查找运统中信息的查找等。因此,如何高效率地
2、实现查找运算是查找表的基本问题,也是本章的重点内容。算是查找表的基本问题,也是本章的重点内容。2022年8月3日星期三7.1 7.1 基本概念与术语基本概念与术语 关键字关键字:是数据元素(或记录)中某个数据项的值,是数据元素(或记录)中某个数据项的值,用它可以标识(识别)一个数据元素(或记录用它可以标识(识别)一个数据元素(或记录)。)。若若此关键字可以唯一地标识一个记录,则称此关键此关键字可以唯一地标识一个记录,则称此关键字为主关键字(字为主关键字(primary keyprimary key),不同的记录其主关键),不同的记录其主关键字不同,反之,称用以识别若干记录的关键字为次关字不同,
3、反之,称用以识别若干记录的关键字为次关键字(键字(secondary keysecondary key)。)。查找(查找(searchingsearching):根据给定的某个值,在表中):根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素。确定一个关键字等于给定值的记录或数据元素。2022年8月3日星期三7.2 7.2 顺序表的查找顺序表的查找 当顺序表作为线性表的存储结构时,存储结点间当顺序表作为线性表的存储结构时,存储结点间的位置关系与对应数据元素之间的逻辑关系(邻接关的位置关系与对应数据元素之间的逻辑关系(邻接关系)是一致的,即数据元素在线性表中的次序与它们系)是一致的,
4、即数据元素在线性表中的次序与它们在顺序表中次序相同。在顺序表中次序相同。顺序表的存储结构如下:顺序表的存储结构如下:typedef strict typedef strict ElemType ElemType*elemelem;/存储空间基址存储空间基址,建表时按照实际长度分配建表时按照实际长度分配,0,0号号单元不用单元不用intint length;length;/顺序表长度顺序表长度STableSTable;2022年8月3日星期三 查找可分为静态查找和动态查找两大类。查找可分为静态查找和动态查找两大类。静态查找是指在查找时只对数据元素进行查询和检静态查找是指在查找时只对数据元素进行查
5、询和检索。索。动态查找除包括静态查找的要求外,还包括插入数动态查找除包括静态查找的要求外,还包括插入数据元素集合中不存在的数据元素,或者从数据元素集合据元素集合中不存在的数据元素,或者从数据元素集合中删除已存在的某个数据元素。中删除已存在的某个数据元素。静态查找时构造的存储结构称作静态查找表。静态查找时构造的存储结构称作静态查找表。动态查找时构造的存储结构称作动态查找表。动态查找时构造的存储结构称作动态查找表。2022年8月3日星期三 顺序查找适用于线性表的顺序存储结构,也适用于顺序查找适用于线性表的顺序存储结构,也适用于链式存储结构,表内的数据元素是无序的。链式存储结构,表内的数据元素是无序
6、的。顺序查找的查找过程为:顺序查找的查找过程为:从顺序表中的最后一个记录开始,逐个进行记录的从顺序表中的最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值关键字和给定值的比较,若某个记录的关键字和给定值比较后相等,则查找成功,找到所查记录;如果直至第比较后相等,则查找成功,找到所查记录;如果直至第一个记录,关键字和给定值比较都不等,则表明表中没一个记录,关键字和给定值比较都不等,则表明表中没有所查找的记录,查找失败。有所查找的记录,查找失败。查找算法描述如算法查找算法描述如算法7.17.1所示。所示。7.2.1 7.2.1 顺序查找顺序查找2022年8月3日星期三
7、 int Search_Seq(STable ST,KeyType key)int Search_Seq(STable ST,KeyType key)/在顺序表在顺序表STST中顺序查找其关键字等于中顺序查找其关键字等于keykey的数据元的数据元素素 i=0;i=0;ST.elem0.key=key;ST.elem0.key=key;/设置监视哨设置监视哨 for(i=ST.length;ST.elemi.key!=key;-i);for(i=ST.length;ST.elemi.key!=key;-i);/从后往前找从后往前找 retirn i;retirn i;/找不到时,找不到时,i
8、i为为0 0/Search_Seq/Search_Seq算法算法 7.1 7.12022年8月3日星期三 在查找之前先将在查找之前先将ST.elem0ST.elem0的关键字赋值的关键字赋值keykey,则,则ST.elem0 ST.elem0 在此起到了哨兵的作用。目的是避免在查在此起到了哨兵的作用。目的是避免在查找的每一步都要判断整个表是否查找完毕,即在找的每一步都要判断整个表是否查找完毕,即在forfor循循环中省去了判定下标越界的条件,提高了算法的效率。环中省去了判定下标越界的条件,提高了算法的效率。ST.elemi.keyST.elemi.key表示第表示第i i个记录的关键字,个记
9、录的关键字,ST.lengthST.length表表示顺序表中元素的个数,示顺序表中元素的个数,keykey为查找的对象。为查找的对象。2022年8月3日星期三 查找算法的基本操作也就是查找算法的基本操作也就是“将记录的关键字和将记录的关键字和给定值进行比较给定值进行比较”,比较的次数依赖于这个数据元素,比较的次数依赖于这个数据元素在结构中所处的位置。在结构中所处的位置。为了确定要查找的记录位置,与给定值进行比较为了确定要查找的记录位置,与给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的的关键字个数的期望值称为查找算法在查找成功时的平均查找长度平均查找长度ASL(average s
10、earch length)ASL(average search length)。对于含。对于含有有n n个记录的表,平均查找长度的计算公式为:个记录的表,平均查找长度的计算公式为:2022年8月3日星期三 其中,其中,P Pi i为查找第为查找第i i个记录的概率,个记录的概率,;C Ci i为在表中找到其关键字与给定值相等的第为在表中找到其关键字与给定值相等的第i i个记个记录时,和给定值已进行过比较的关键字个数。一般录时,和给定值已进行过比较的关键字个数。一般情况下情况下,C,Ci i等于等于n ni+1i+1。niiiCPASL111niiP2022年8月3日星期三若查找每个元素的概率相
11、同,即为若查找每个元素的概率相同,即为P P1 1=P=P2 2=P=Pn n=1/n=1/n。对于等概率的查找,其平均查找长度的计。对于等概率的查找,其平均查找长度的计算公式可简化为:算公式可简化为:ASL =ASL =iniiCP1niiCn11niinn1)1(121n2022年8月3日星期三 查找算法的平均查找长度应是查找成功时的平均查找长度查找算法的平均查找长度应是查找成功时的平均查找长度与查找不成功时的平均查找长度之和的一半。如果查找不成与查找不成功时的平均查找长度之和的一半。如果查找不成功,比较次数为功,比较次数为n+1n+1。假设查找成功与不成功的可能性相同,。假设查找成功与不
12、成功的可能性相同,则则 ASL=ASL=)1(21)1(1211ninnni)1(43n2022年8月3日星期三 折半查找又称为二分查找,是一种效率较高的查找折半查找又称为二分查找,是一种效率较高的查找方法,它要求线性表的结点必须是按关键字非递减方法,它要求线性表的结点必须是按关键字非递减(或非或非递增递增)的次序排列的,并采用顺序结构存储。的次序排列的,并采用顺序结构存储。折半查找的查找过程是:折半查找的查找过程是:首先确定待查记录所在的范围,然后逐渐缩小范围直首先确定待查记录所在的范围,然后逐渐缩小范围直到查到或者查不到结果为止。假设指针到查到或者查不到结果为止。假设指针lowlow指向待
13、查记录指向待查记录所在范围的下界所在范围的下界ST.elemST.elem1 1,指针,指针highhigh指向待查记录所在指向待查记录所在范围范围的上界的上界ST.elemST.lengthST.elemST.length,指针指针midmid指向待查记录指向待查记录所在范围的中间位置,即所在范围的中间位置,即mid=(low+high)/2mid=(low+high)/2。用给定。用给定值值keykey与与midmid指定的值指定的值ST.elemmidST.elemmid相比较。若相等,则表相比较。若相等,则表示查找成功;若不相等,则缩小范围,直到新的示查找成功;若不相等,则缩小范围,直
14、到新的midmid值等值等于给定值或者查找区间的大小小于零时为止。于给定值或者查找区间的大小小于零时为止。7.2.2 7.2.2 有序表的折半查找有序表的折半查找2022年8月3日星期三 【例【例7-17-1】已知如下已知如下1010个数据元素的有序表个数据元素的有序表(关键字即为数关键字即为数据元素的值据元素的值)7 7,1818,2525,3737,5454,6262,7676,8080,8989,9898要求查找关键字为要求查找关键字为2525和和8585的数据元素。的数据元素。解:首先看给定值解:首先看给定值key=25key=25的查找过程:的查找过程:(1)(1)令指针令指针low
15、low指向第指向第1 1个元素,指针个元素,指针highhigh指向第指向第1010个数据元素,个数据元素,此时此时mid=mid=(1+10)/2(1+10)/2=5=5。2022年8月3日星期三 (2)key(2)key小于小于ST.elemmid.keyST.elemmid.key,说明待查找元素若,说明待查找元素若存在,必在区间存在,必在区间lowlow,mid-1mid-1区间内,令指针区间内,令指针highhigh等于等于mid-1(mid-1(第第4 4个数据元素个数据元素),重新得到,重新得到mid=mid=(1+4)/2(1+4)/2=2=2。2022年8月3日星期三(3)(
16、3)此时此时keykey大于大于ST.elemmid.keyST.elemmid.key,说明待查元素若存在,说明待查元素若存在,必在区间必在区间mid+1mid+1,highhigh区间内,令指针区间内,令指针lowlow等于等于mid+1 mid+1(第第3 3个数据元素个数据元素),重新得到,重新得到mid=mid=(3+4)/2(3+4)/2=3=3。(4)4)此时此时ST.elemmid.keyST.elemmid.key等于等于2525,与给定值相等,查找,与给定值相等,查找成功,返回该元素在表中的位置即指针成功,返回该元素在表中的位置即指针midmid的值。的值。2022年8月3
17、日星期三 由例可见,当由例可见,当keykey值小于值小于ST.elemmid.keyST.elemmid.key,说明,说明待查元素位置在待查元素位置在lowlow和和midmid之间,则令指针之间,则令指针high=mid-1high=mid-1,在表的前半部分取中间位置的记录比较;当在表的前半部分取中间位置的记录比较;当keykey值大值大于于ST.elemmid.keyST.elemmid.key,说明待查元素的位置在,说明待查元素的位置在midmid和和highhigh之间,则令指针之间,则令指针low=mid+1low=mid+1,在表的后半部,在表的后半部分再取中间位置的记录进行
18、比较。分再取中间位置的记录进行比较。折半查找的算法可描述为折半查找的算法可描述为算法算法7.27.2。2022年8月3日星期三 折半查找的过程可用一棵二叉树来表示,如下图折半查找的过程可用一棵二叉树来表示,如下图所示,树中每个结点表示表中的一个记录,结点的值所示,树中每个结点表示表中的一个记录,结点的值对应元素的关键字,结点上面的编号为对应的值在表对应元素的关键字,结点上面的编号为对应的值在表中的位置。每个根结点对应当前查找区间的中间元素中的位置。每个根结点对应当前查找区间的中间元素ST.elemmidST.elemmid,它的左子树和右子树分别对应该区,它的左子树和右子树分别对应该区间的前半
19、部分和后半部分,通常把此二叉树称为折半间的前半部分和后半部分,通常把此二叉树称为折半查找的判定树。查找的判定树。2022年8月3日星期三2022年8月3日星期三 由此图得出结论,在有序表中折半查找成功的过由此图得出结论,在有序表中折半查找成功的过程就是一条从根结点到满足条件的记录所对应结点的程就是一条从根结点到满足条件的记录所对应结点的路径,给定值同关键字比较的次数就等于该路径的结路径,给定值同关键字比较的次数就等于该路径的结点数,或该结点在判定树上的层次数,它最多不会超点数,或该结点在判定树上的层次数,它最多不会超过树的深度,而具有过树的深度,而具有n n个结点的判定树的深度为个结点的判定树
20、的深度为log2nlog2n+1+1,所以折半查找在查找成功时和给定值进,所以折半查找在查找成功时和给定值进行比较的关键字个数至多为行比较的关键字个数至多为log2nlog2n+1+1。2022年8月3日星期三 折半查找不成功时,如该例查找给定值为折半查找不成功时,如该例查找给定值为8585,在折,在折半查找的判定树上的路径是从根结点出发最后指向空子半查找的判定树上的路径是从根结点出发最后指向空子树的过程,该路径中给定值与关键字进行比较的次数仍树的过程,该路径中给定值与关键字进行比较的次数仍为路径中的结点数,所以折半查找不成功时,给定值与为路径中的结点数,所以折半查找不成功时,给定值与关键字进
21、行比较的次数也不超过关键字进行比较的次数也不超过log2nlog2n+1+1。2022年8月3日星期三 假设表中每个记录的查找概率都相等,即假设表中每个记录的查找概率都相等,即Pi=1/nPi=1/n,则查找成功时折半查找的平均查找长度为:则查找成功时折半查找的平均查找长度为:1221112log(1)1 log(1)1nnii iiinASLpcinnn 2022年8月3日星期三 斐波那契查找是根据斐波那契序列的特点对表进行斐波那契查找是根据斐波那契序列的特点对表进行分割的。斐波那契序列定义为:分割的。斐波那契序列定义为:F F0 0=0=0,F F1 1=1=1,F Fi i=F=Fi i
22、-1+F1+Fi i-2-2(i2i2)。)。设记录个数比某个斐波那契数小设记录个数比某个斐波那契数小1 1,即,即n=Fn=Fi i-1-1,斐波,斐波那契查找是把关键字那契查找是把关键字keykey与与ST.elemFST.elemFi-1i-1.key.key作比较,作比较,若相等,则成功;若若相等,则成功;若keyST.elemFkeyST.elemFkeyST.elemFi-1i-1.key.key,则继续在则继续在ST.elemFST.elemFi-1i-1+1+1至至ST.elemFST.elemFi-1i-1 中查找,表的中查找,表的元素个数是元素个数是(F(Fi-1i-1)-
23、(F)-(Fi-1i-1+1)+1=F+1)+1=Fi i-F-Fi-1i-1-1=F-1=Fi-2i-2-1-1。7.2.3 7.2.3 斐波那契查找斐波那契查找2022年8月3日星期三 与折半查找相比,与折半查找相比,FibonacciFibonacci查找法的明显优点查找法的明显优点在于它只涉及加法和减法运算,而不用除法。因为除在于它只涉及加法和减法运算,而不用除法。因为除法比加减法要占去更多的机时,所以斐波那契查找的法比加减法要占去更多的机时,所以斐波那契查找的平均性能要比折半查找好,但最坏情况下的性能(虽平均性能要比折半查找好,但最坏情况下的性能(虽然仍是然仍是O(lognO(log
24、n))却比折半查找差。)却比折半查找差。2022年8月3日星期三 分块查找又称索引顺序查找,是顺序查找的改进方法。分块查找又称索引顺序查找,是顺序查找的改进方法。分块查找算法中,除了表本身以外,还需建立一个分块查找算法中,除了表本身以外,还需建立一个“索引索引表表”。下图中,表中下图中,表中1818个记录,分成三块,对每一块建立一个记录,分成三块,对每一块建立一个索引项。索引项有两项内容:关键字项,其值为该块内个索引项。索引项有两项内容:关键字项,其值为该块内最大关键字的值;指针项,指示该块中第一个记录在表中最大关键字的值;指针项,指示该块中第一个记录在表中的位置。索引表按关键字有序排列,表或
25、者有序排列或者的位置。索引表按关键字有序排列,表或者有序排列或者分块有序排列。所谓分块有序排列。所谓“分块有序分块有序”指的是后一块表中所有指的是后一块表中所有记录的关键字均大于前一块表中的最大关键字。记录的关键字均大于前一块表中的最大关键字。7.2.4 7.2.4 分块查找分块查找2022年8月3日星期三 分块查找可以分为两步:首先在索引表中确定待查记分块查找可以分为两步:首先在索引表中确定待查记录所在块录所在块(可以用顺序或折半查找法可以用顺序或折半查找法),然后在块内顺序查,然后在块内顺序查找给定值找给定值(只能用顺序查找法只能用顺序查找法)。主表被分成主表被分成3 3块,每块都含有块,
展开阅读全文