收藏 分享(赏)

专题三 数据结构与算法.ppt

上传人:涵涵文库 文档编号:5538476 上传时间:2019-03-06 格式:PPT 页数:156 大小:2.27MB
下载 相关 举报
专题三 数据结构与算法.ppt_第1页
第1页 / 共156页
专题三 数据结构与算法.ppt_第2页
第2页 / 共156页
专题三 数据结构与算法.ppt_第3页
第3页 / 共156页
专题三 数据结构与算法.ppt_第4页
第4页 / 共156页
专题三 数据结构与算法.ppt_第5页
第5页 / 共156页
点击查看更多>>
资源描述

1、查找与排序,专题三,数据结构与控制算法分析,学习内容与要求,学习和掌握顺序查找和折半查找算法的原理和实现; 学习和掌握二叉排序树的概念及其构造方法、二叉排序树的查找算法原理。 学习和掌握选择排序、交换排序、插入排序、归并排序和快速排序方法的原理。,第 2 页,1 Search (查找/搜索),第 3 页,第 4 页,所谓查找(或搜索),就是在数据集合中寻找满足某种条件的数据对象:1.查找成功 即找到满足条件的数据对象时, 作为结果, 可报告该对象在结构中的位置, 还可给出该对象中的具体信息。2.查找不成功 或搜索失败。作为结果, 应报告一些信息, 如失败标志、位置等 。,通常称用于查找的数据集

2、合为查找结构,它是由同一数据类型的数据(或记录)组成。 每个对象有若干属性,其中有一个属性,其值可唯一地标识这个对象,称为关键字。使用基于关键字的搜索,查找结果应是唯一的。但在实际应用时,查找条件是多方面的,可以使用基于属性的查找方法,但查找结果可能不唯一。,第 5 页,实施查找时有两种不同的环境 静态环境 查找结构不需进行插入和删除操作。 静态查找表,第 6 页,动态环境 查找过程中可能要对查找结构执行数据插入、删除或修改等操作,并对查找结构进行调整,结构可能发生变化。 动态查找表 动态查找表的表结构是在查找过程中动态生成的。,第 7 页,以线性结构表示静态查找表。 基本原理:将待查找记录依

3、次逐个与表中记录进行比较。,1.1 顺序查找(Sequential Search),第 8 页,SL.elem,顺序查找过程(从前向后查找),假设给定查找值 e=64, 要求 SL.elemk = e, 问: k = ?,k,k,第 9 页,SL.elem,i,SL.elem,i,60,i,key=64,key=60,i,64,顺序查找过程(从后向前查找),0单元用于存放待查找关键字,作为“哨兵”(guard),返回0,返回7,第 10 页,int Search_Seq( TB SL, TYPE key ) SL.elem0.key = key; / “哨兵”for (i=SL.length;

4、 SL.elemi.key!=key; -i); / 从后往前找return i; / 查找成功时i为有效下标,否则i为0 ,顺序查找算法实现(从后向前查找),第 11 页,查找成功:最少比较次数最多比较次数平均比较次数查找失败:最少比较次数最多比较次数平均比较次数,查找算法的评价指标,第 12 页,查找算法的平均查找长度ASL (Average Search Length) 指为了确定记录在查找表中的位置,需要和给定值进行关键字比较的次数的期望值:,其中,n为表长,Pi为查找表中第i个记录的概率,且 ;Ci为查找到该记录时,曾和给定值进行关键字比较的次数。,第 13 页,在等概率情形,查找任

5、一记录的概率相等:pi = 1/n, i = 1, 2, , n,查找不成功时,,查找成功时,,以从前向后顺序查找算法为例,,查找算法时间复杂度?,O(n),顺序查找算法总结 查找长度:查找成功:最少比较次数 1最多比较次数 n 平均比较次数 (n+1)/2查找失败:最少比较次数 n最多比较次数 n平均比较次数 n 优点:查找结构无特殊要求(线性结构均适用);算法简单; 缺点:查找效率较低,不适于大表查找。,第 14 页,第 15 页,上述按顺序查找表的查找算法简单,但平均查找长度较大,不适用于表长较大的查找结构。,1.2 折半查找(二分查找) (Binary Search),若静态查找表为有

6、序表,则查找过程可以基于“折半”进行。,基于有序顺序表的折半查找,设n个数据对象存放在一个有序顺序表中,并按其关键字值从小到大(或从大到小)排好序。 原理:折半查找时, 每次都先求出位于查找区间正中的对象的下标mid,用其关键字与给定值x比较,然后根据比较结果将查找区间缩小一半,直至找到被查找对象。,第 16 页,折半查找算法 (设数据按关键字从小到大有序排列),1.Elementmid.key=x 查找成功; 2.Elementmid.keyx 把查找区间缩小为表的前半部分,继续折半查找; 3.Elementmid.keyx 把查找区间缩小为表的后半部分,继续折半查找; 如果查找区间缩小到一

7、个对象,且仍未找到想要查找的对象,则查找失败。,第 17 页,第 18 页,SL.elem,SL.length,例如: key=64 的查找过程如下,low,high,mid,mid,mid,mid = (low+high)/2 (向下取整) Low 指示查找区间的下界 high 指示查找区间的上界,low,high,第 19 页,查找成功的例子,-1 0 1 3 4 6 8 10 12,6,0 1 2 3 4 5 6 7 8,搜索,low,mid,high,6,6 8 10 12,5 6 7 8,low,mid,high,6,6,5,low,mid,high,6,(1) low=0,high

8、=8,mid=4;由于ElemmidKey, 因此, high=mid-1=5; (3)mid=5, Elemmid =Key,因此查找成功.,第 20 页,查找失败的例子,-1 0 1 3 4 6 8 10 12,5,0 1 2 3 4 5 6 7 8,搜索,low,mid,high,5,6 8 10 12,5 6 7 8,low,mid,high,6,5,5,low,mid,high,5,(1) low=0,high=8,mid=4;由于ElemmidKey, 因此, high=mid-1=5; (3)mid=5,由于Elemmid Key,因此, high=mid-1=4. 由于此时hi

9、ghlow,因此查找失败.,第 21 页,折半查找算法实现 int Search_Bin(TB SL, TYPE key) int low = 1, high = SL.length,mid;while(lowSL.elemmid.key)low=mid+1;return 0; ,折半查找算法总结 平均查找长度:查找成功:时间复杂度: O(log2n) 优点:查找效率高; 缺点:查找结构有限制;插入、删除操作困难。 适用场合:记录按关键字值有序排列,查找结构为顺序表结构,数据不经常变动(静态查找)。,第 22 页,第 23 页,若要对动态查找表进行高效率的查找操作(包含可能的数据删除或插入操作

10、),可采用二叉排序树作为查找表的组织形式。,1.3 二叉排序树查找,第 24 页,(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;,二叉排序树(或二叉查找树)或者是一棵空树;或者是具有如下特性的二叉树:,(3)它的左、右子树也都分别是二叉排序树。,(2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;,二叉排序树的概念,第 25 页,50,30,80,20,90,10,85,40,35,25,23,88,是二叉排序树,45,第 26 页,50,30,80,20,90,10,85,40,35,25,23,88,不是二叉排序树,66,第 27 页,50,30,80,20,

11、90,10,85,40,42,25,23,88,也 是二叉排序树,46,不,第 28 页,输入数据 53, 78, 65, 17, 87, 09, 81, 15 ,根据输入序列构造二叉排序树,第 29 页,注意:同样 n个数据 1, 2, , n ,输入顺序不同,建立的二叉排序树形态也不同。例如,,1,2,3,1,3,2,2,1,3,3,2,1,3,1,2,第 30 页,如果对一棵二叉排序树进行中序遍历,其遍历序列是将树中的各结点关键字按从小到大的顺序排列起来。,二叉排序树与中序遍历,第 31 页,1)若给定值等于根结点的关键字, 则查找成功;2)若给定值小于根结点的关键字,则继续在左子树上进

12、行查找;3)若给定值大于根结点的关键字,则继续在右子树上进行查找;,若二叉排序树为空,则查找不成功;否则:,二叉排序树的查找算法,第 32 页,在查找过程中,生成了一条查找路径。,从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点。,或者,从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。,查找成功,查找不成功,查找40 查找成功,查找28 查找失败,第 33 页,50,30,80,20,90,85,40,35,88,32,查找关键字,50,50,50,30,40,35,50,50,80,90,root,二叉排序树结点的删除,相当于删去有序序列上的一个记录,应保证删

13、除结点后,二叉排序树的特性不变。 删除结点可有三种情况: 1.若删除结点为叶子结点,即其左子树和右子树均为空树。由于叶子结点的存在若不破坏整株树的结构,则只需修改其父结点的指针即可。 2.若删除结点只有左子树或只有右子树,此时只要令左子树或右子树的根结点直接代替被,二叉排序树结点的删除,删除结点即可,也不破坏二叉排序树的特性。 3.若删除结点的左、右子树均不空,不能简单处理,可有两种情况。例:,F,P,f,p,pL,pR,(a),f,F,P,C,p,c,CL,Q,PR,q,S,QL,SL,S,F,C,c,CL,S,S,f,SL,PR,(b),(c),方法1: 将删除结点的右子树,作为删除结点的

14、左子树的最右结点的右子树.,f,F,S,C,p,c,CL,Q,PR,q,QL,SL,(d),方法2: 用删除结点的左子树的最右结点代替删除结点,同时用删除结点的左子树的最右结点的左子树(如果有)代替该结点.(左子树最大结点取代,也可以右子树最小结点取代),第 38 页,二叉排序树查找性能分析,对于每一棵特定的二叉排序树,均可按照平均查找长度的定义来求它的 ASL 值。但是,由值相同的 n个关键字,构造得到的不同形态的各棵二叉排序树的平均查找长度的值可能不同,甚至可能差别很大。,由关键字序列 3,1,2,5,4构造而得的二叉排序树:,由关键字序列 1,2,3,4,5构造而得的二叉排序树:,ASL

15、 =(1+2+3+4+5)/ 5 = 3,ASL =(1+2+3+2+3)/ 5 = 2.2,第 39 页,二叉排序树总结,就平均查找性能而言,二叉排序树查找和折半查找相差不大;就维护表的有序性而言,二叉排序树更为有效(二叉排序树的结点插入、删除方便,无需移动大量结点)。因此,适用于动态查找环境。,D,G,E,D,A,B,C,F,E,G,B,A,起因:提高查找速度,避免最坏情况出现。如右图情况的出现。,C,F,平衡因子(平衡度):结点的平衡度是结点的左子树的高度右子树的高度。平衡二叉树:每个结点的平衡因子都为 1、1、0 的二叉树。或者说每个结点的左右子树的高度最多差一的二叉树。,平衡二叉树,

16、平衡二叉排序树AV树,定义:一棵平衡二叉排序树或者是空树,或者是具有下列性质的二叉排序树: 1、左子树与右子树的高度之差的绝对值小于等于1; 2、左子树和右子树也是平衡二叉排序树。 平衡二叉排序树的平均查找长度为O(log2n)。 平衡因子:结点的左子树深度与右子树深度之差:-1,0,1。,是平衡树 不是平衡树,以插入为例:在左图所示的平衡树中插入数据为 2 的结点。插入之后仍应保持平衡分类二叉树的性质不变。,14,12,5,3,9,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,2,+1,+1,+2,原平衡度为 0,危机结点,

17、如何用最简单、最有效的办法保持平衡分类二叉树的性质不变?,解决方案: 不涉及到危机结点的父亲结点,即以危机结点为根的子树的高度应保持不变(图为 3 )。 新结点插入后,找到第一个平衡度不为 0 的结点(如左图结点 9)即可。新插入的结点和 第一个平衡度不为 0 的结点(也可能是危机结点)之间的结点,其平衡度皆为 0。 在调整中,仅调整那些在平衡度变化的路径上的结点(如:3 5 9),其它结点不予调整。 仍应保持二叉排序树的性质不变。,14,12,5,3,9,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,2,+1,+1,+2,原

18、平衡度为 0,危机结点,关键:将导致出现危机结点的情况全部分析清楚,就可以使得平衡分类二叉树的性质保持不变!,14,9,3,2,5,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,12,0,0,最低层失衡结点为A,在结点A的左子树的左子树上插入新结点S后,导致失衡,由A和B的平衡因子可知,BL、BR和AR深度相同,为恢复平衡并保持二叉排序树的特性,可将A改为B的右子,B原来的右子BR改为A的左子,这相当于以B为轴,对A做了一次顺时针旋转。,不平衡二叉排序树的调整LL型,不平衡二叉排序树的调整LL型,A-lchild=B-rchild

19、 B-rchild=A,最低层失衡结点为A,在结点A的左子树的右子树上插入新结点S后,导致失衡,假设在CL下插入S,由A、B、C的平衡因子可知,CL与CR深度相同,BL与AR深度相同,且BL、AR的深度比CL、CR的深度大1;为恢复平衡并保持二叉排序树的特性,可将B改为C的左子,而C原来的左子CL改为B的右子,然后将A改为C的右子,C原来的右子CR改为A的左子;这相当于以B为轴,对A做了一次顺时针旋转。,不平衡二叉排序树的调整LR型,不平衡二叉排序树的调整LR型,A,B,C,C,A,B,A-lchild=c-rchild B-rchild=c-lchild c-rchild=A c-lchil

20、d=B,最低层失衡结点为A,在结点A的右子树的右子树上插入新结点S后,导致失衡,由A和B的平衡因子可知,BL、BR和AL深度相同,为恢复平衡并保持二叉排序树的特性,可将A改为B的左子,B原来的左子BL改为A的右子,这相当于以B为轴,对A做了一次逆时针旋转。,不平衡二叉排序树的调整RR型,不平衡二叉排序树的调整RR型,A-rchild=B-lchild B-lchild=A,最低层失衡结点为A,在结点A的右子树的左子树上插入新结点S后,导致失衡,假设在CR下插入S,由A、B、C的平衡因子可知,CL与CR深度相同,AL与BR深度相同,且AL、BR的深度比CL、CR的深度大1;为恢复平衡并保持二叉排

21、序树的特性,可将B改为C的右子,而C原来的右子CR改为B的左子,然后将A改为C的左子,C原来的左子CL改为A的右子;这相当于以B为轴,对A做了一次顺时针旋转。,不平衡二叉排序树的调整RL型,不平衡二叉排序树的调整RL型,A,B,C,A-rchild=c-lchild B-lchild=c-rchild c-lchild=A c-rchild=B,1、引入大量数据存放在外存中,通常存放在硬盘中。由于是海量数据,不可能一次调入内存。因此,要多次访问外存。但硬盘的驱动受机械运动的制约,速度慢。所以,主要矛盾变为减少访外次数。在 1970 年由 R bayer 和 E macreight 提出用B_

22、树作为索引组织文件。提高访问速度、减少时间。,内存,用二叉树组织文件,当文件的记录个数为 100,000时,要找到给定关键字的记录,需访问外存17次(log100,000),太长了!,50,25,10,75,15,35,60,90,20,30,40,55,70,80,95,索引文件,数据文件,文件头,可常驻内存,文件访问示意图:索引文件、数据文件存在盘上,B_ 树,m 阶 B_ 树的 定义,定义:一棵m阶的B-树,或者为空树,或为满足下列特性的m叉树:树中每个结点至多有m棵子树;若根结点不是叶子结点,则至少有两棵子树;除根结点之外的所有非终端结点至少有m/2 棵子树;所有的非终端结点中包含以下

23、信息数据:(n,A0,K1,A1,K2,Kn,An) 其中:Ki(i=1,2,n)为关键码,且KiKi+1,Ai为指向子树根结点的指针(i=0,1,n),且指针Ai-1所指子树中所有结点的关键码均小于Ki (i=1,2,n),An所指子树中所有结点的关键码均大于Kn, m/2 1nm 1 ,n为关键码的个数。所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。,例如:m = 4 阶 B_ 树。除根结点和叶子结点之外,每个结点的儿子个数至少为 m/2 = 2 个;结点的关键字个数至少为 1 。该 B_ 树的深度为 4

24、。叶子结点都在第 4 层上。,1,99,3,47,58,64,1,39,1,27,1,11,2,43,78,1,18,1,35,第 1 层,第 2 层,第 3 层(L层),第 4 层(L1层),一棵5阶的B-树,其深度为4,B树(续),B树的查找1、首先找到根结点,与根结点各键值进行比较,如果 KxKi+1则查找Pi+1指向的结点;如果Ki KxKi+1则查找Pi指向的结点。2、如果顺着某个指针往下找时遇到树叶,则说明Kx不在B树中,即查找失败。3、在下一个结点查找时,重复1,B树(续),在往m阶B树中插入一个关键字(key)时,不是在树中添加一个树叶,而是首先在最底层的某个非终端结点中添加一

25、个关键字,若插入后该结点的关键字数目不超过m-1,则插入完毕;否则要进行分裂结点操作,并且这个分裂过程可能会一直波及到根结点。 设某个结点已有m-1个关键字,那么,在插入一个关键字后,该结点将分裂成两个结点:左边一个结点包含前 个关键字,右边一个结点包含后m-m/2个关键字,而第m/2个关键字被插入到上一级(双亲)结点中。,B树的插入,阶为7的B树 一般来说,要把一个新项目插入到阶为m的B树中处,当所有叶都在l级上,则把新的键插入到l-1,如果该结点现在含有m个键,则把它分为两个结点,并且把键K m/2插入到原来结点的父亲处(于是,父亲处结点的指针p为序列P, K m/2,P所替代).如果需要

26、分裂根结点,根结点是没有父亲的,则只需建立包含单个键K m/2的一个新根结点和两个指针,这样树就长高了一级.,B树(续),B树的删除 1、如果要删除的关键字不在最下面一层的非终端结点中,则可先把待删关键字与它在B树中的后继对换位置,然后删除关键字 2、如果要删除的关键字在最下面一层的非终端结点中,则把它从所在的结点中删除时,可能会导致此结点中关键字少于 (即它的孩子结点少于m/2个)因此,需要进行结点的合并操作。 结点的合并操作可以根据以下两种情况分别进行。,(1)若被删出关键字所在结点中正好有 个关键字而与该结点相邻的左兄弟(或右兄弟)结点中的关键字多于 个则可将其兄弟结点中最大(或最小)的

27、关键字移到双亲结点中,而将双亲结点中该上移关键字的后面一个(或前面一个)关键字下移到被删除关键字所在的结点中。 (2)若被删除关键字所在的结点和其相邻的兄弟结点中的关键字都是 个,则可将删除了关键字的结点和它的双亲结点的一个关键字合并到它的兄弟结点中。如果因此使双亲结点中的关键字少于 个,则需要继续进行合并。,1.4 哈希表技术,以上讨论的表示查找表的各种结构的共同特点:记录在表中的位置和它的关键字之间不存在一个确定的关系, 查找的过程为给定值依次和关键字集合中各个关键字进行比较, 查找的效率取决于和给定值进行比较的关键字个数。 用这类方法表示的查找表,其平均查找长度都不为零。,65,问题:对

28、于频繁使用的查找,我们希望平均查找长度ASL接近于0,预先知道所查关键字在表中的位置 记录在表中位置和其关键字之间存 在一种确定的关系,只有一个办法,66,例如:为每年招收的 1000 名新生建立一张查找表,其关键字为学号,其值的范围为 xx000 xx999 (前两位为年份)。若以下标为000 999 的顺序表表示学号 查找过程可以简单进行: 取给定值(学号)的后三位,不需要经过比较便可直接从顺序表中找到待查关键字。,67,哈希查找的基本思想:在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到所查元素的查找方法 哈希函数:在记录的关键字与记录在表中的存

29、储位置之间建立一个函数关系,以 f(key) 作为关键字为 key 的记录在表中的位置,通常称这个函数 f(key) 为哈希函数。 哈希地址:由哈希函数求出的记录存储位置称为哈希地址,表示成:addr(ai)=f(ki) ai是表中的一个元素(记录) addr(ai)是ai的存储地址 ki是ai的关键字,68,哈希表:应用哈希函数,由记录的关键字确定记录在表中的地址,并将记录放入此地址,这样构成的表叫哈希表,也叫散列表。 哈希查找:又叫散列查找,利用哈希函数进行查找的过程叫,69,Zhao, Qian, Sun, Li, Wu, Chen, Han, Ye, Dai,例:对于如下 9 个关键字

30、,Chen,Zhao,Qian,Sun,Li,Wu,Han,Ye,Dai,问题: 若添加关键字 Zhou , 怎么办?,能否找到另一个哈希函数?,设 哈希函数f(key) = (ASC(关键字第一个字母) -ASC(A)+1)/2,70,哈希函数是一个映象,即 将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的 大小不超出允许范围即可; 由于哈希函数是一个压缩映象,因此,在一般情况下,很容易产生“冲突”现象, 即: key1 key2, 而 f(key1) = f(key2) 很难找到一个不产生冲突的哈希函数。一般情况下,只能选择恰当的哈希函数,使冲突尽可能少地产生。 在构

31、造哈希表时,除了需要选择一个“好”(尽可能少产生冲突)的哈希函数之外;还需要找到一种处理冲突 的方法。,71,构造哈希函数的几种方法,对数字的关键字可有下列构造方法,若是非数字关键字,则需先对其进行数字化处理,1. 直接定址法,3. 平方取中法,5. 除留余数法,4. 折叠法,6. 随机数法,2. 数字分析法,72,(1) 直接定址法,构造:取关键字或关键字的某个线性函数作哈希函数H(key) = key或者 H(key) = a. key + b 特点 直接定址法所得地址集合与关键字集合大小相等,不会发生冲突 实际中能用这种哈希函数的情况很少,73,(2) 数字分析法,构造:对关键字进行分析

32、,取关键字的若干位或其组合作哈希地址 特点:适于关键字位数比哈希地址位数大,且可能出现的关键字事先知道的情况,74,(3) 平方取中法,构造:以关键字的平方值的中间几位作为存储地址。求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。 特点:关键字中的每一位都有某些数字重复出现频度很高的现象。,75,(4) 折叠法,构造:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址 种类 移位叠加:将分割后的几部分低位对齐相加 间界叠加:从一端沿分割界来回折送,然后对齐相加 特点:适于关键字位数很多,且每一位上数字分布大致均匀情况,

33、76,例 关键字为 :0442205864,哈希地址位数为4,77,(5) 除留余数法,构造:取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即H(key)=key % pp=m 且P 一般应为接近 m 的素数或是不含20 以下的质因子 特点 简单、常用: 可与上述几种方法结合使用 p的选取很重要: p选的不好,容易产生同义词,对P要加一定的限制,78,给定一组关键字为:12, 39, 18, 24, 33, 21假定hash表的长度为12 若取 p=9, 则他们对应的哈希函数值将为: 3, 3, 0, 6, 6, 3,例如:,为什么要对 p 加限制?,若 p 中含质因子 3,

34、则所有含质因子 3 的关键字均映射到“3 的倍数”的地址上,从而增加了“冲突”的可能。,79,(6) 随机数法,构造:取关键字的随机函数值作哈希地址H(key)=random(key) 适于关键字长度不等的情况,实际造表时,采用何种构造哈希函数的方法取决于建表的关键字集合的情况(包括关键字的范围和形态),总的原则是使产生冲突的可能性降到尽可能地小。,80,例 有80个记录,关键字为8位十进制数,哈希地址为2位十进制数, ,分析: 只取8只取1只取3、4只取2、7、5数字分布近乎随机 所以:取任意两位或两位与另两位的叠加作哈希地址,81,处理冲突的方法,处理冲突 :为产生冲突的地址寻找下一个哈希

35、地址。 主要有二种方法 开放定址法 链地址法,82,思想:为产生冲突的关键字寻找一个新的地址 Hi(key), 求得一个地址序列:H0, H1, H2, , Hs 1 sm-1其中:H0 = H(key)H1 = (H(key) + d1 ) % m H2 = (H(key) + d2 ) % m Hi = ( H(key) + di ) % m i=1, 2, , s,(1) 开放定址法,83,对增量 di 有三种取法 线性探测再散列:di=1,2,3,m-1 二次探测再散列:di=1,-1,2,-2,3,k 伪随机探测再散列:di=伪随机数序列 注意:增量 di 应具有“完备性”,即:产生

36、的 Hi 均不相同,且所产生的 s个 Hi 值能覆盖哈希表中所有地址。要求: 平方探测时的表长 m 必为形如 4j+3 的素数(如: 7, 11, 19, 23, 等); 随机探测时的 m 和 di 没有公因子。,84,例 表长为11的哈希表中已填有关键字为17,60,29的记录,H(key)=key % 11,现有第4个记录,其关键字为38,按三种处理冲突的方法,将它填入表中,(1) H(38)=38 % 11=5 冲突H1=(5+1) % 11=6 冲突H2=(5+2) % 11=7 冲突H3=(5+3) % 11=8 不冲突,38,(2) H(38)=38 % 11=5 冲突H1=(5+

37、1) % 11=6 冲突H2=(5-1) % 11=4 不冲突,38,(3) H(38)=38 % 11=5 冲突设伪随机数序列为9,则:H1=(5+9) % 11=3 不冲突,38,线性探测,二次探测,随机探测,将所有哈希地址相同的记录都链接在同一链表中 例:关键字集合 19, 01, 23, 14, 55, 68,11, 82, 36 哈希函数为:H(key)=key % 7,(2) 链地址法,0 1 2 3 4 5 6,14,01,36,19,82,23,11,68,55,86,哈希表的查找及其性能分析,查找过程:和造表过程一致,对于给定值,由哈希函数和解决冲突的方法定位记录的存储位置。

38、,87,例:给出哈希表HT,哈希函数 H(key)=key % 11,解决冲突方法:开放地址法中线性探测再散列Hi(key)=(H(KEY)+di)% 11 (d1=1, d2=2, d3=3, ),试查找关键字19 、02,查找关键字19,用哈希函数求19 对应的哈希地址: H(19)=19 % 11=8,将HT8与19比较相等 查找成功,88,查找关键字02,用哈希函数求02 对应的哈希地址:H(02)=02 % 11=2,将HT2与02比较不相等,用解决冲突方法为02求下一个“地址” (取d1=1)H1 (02)=(H(02)+ d1)% 11=3,将HT3与02比较相等 查找成功,89

39、,查找算法实现:开放定址哈希表,int hashsize = 997, . ; typedef struct ElemType *elem; int count; / 当前数据元素个数int sizeindex; / hashsizesizeindex为当前容量 HashTable;#define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1,90,bool SearchHash (HashTable H, KeyType K, int &p, int &c) / 在开放定址哈希表H中查找关键码为K的记录 / SearchHash,p =

40、 Hash(K); / 求得哈希地址,while (H.elemp.key != NULLKEY / 求得下一探查地址 p,if (K=H.elemp.key) return 1; / 查找成功,返回待查数据元素位置 p,else return 0; / 查找不成功,91,bool InsertHash (HashTable &H, Elemtype e) ,Int c = 0;,if ( HashSearch ( H, e.key, p, c ) = SUCCESS )return DUPLICATE;/ 表中已有与 e 有相同关键字的元素,elseH.elemp = e; +H.count

41、; return OK;/ 查找不成功时,返回 p为插入位置,else RecreateHashTable(H); / 重建哈希表,if ( c hashsizeH.sizeindex/2 ) / 冲突次数 c 未达到上限,(阀值 c 可调),92,哈希表查找分析 从查找过程得知,哈希表查找的平均查找长度实际上并不等于零。,决定哈希表查找的ASL的因素:(1) 选用的哈希函数;(2) 选用的处理冲突的方法;(3) 哈希表饱和的程度,装载因子=n/m 值的大小(n记录数,m表的长度),93,一般情况下,可以认为选用的哈希函数是“均匀”的,则在讨论ASL时,可以不考虑它的因素。 因此,哈希表的AS

42、L是处理冲突方法和装载因子的函数。 例: 关键字集合 7, 15, 20, 31, 48, 53,64, 76, 82, 99 ,线性探测处理冲突时, ASL =,平方探测处理冲突时, ASL =,链地址法处理冲突时, ASL =,2.4,2.0,1.7,94,线性探测再散列,链地址法,二次探测或随机探测再散列,可以证明:查找成功时有下列结果:,95,从以上结果可见:,哈希表的平均查找长度是 的函数,而不是 n 的函数。,这说明,用哈希表构造查找表时,可以选择一个适当的装填因子 ,使得平均查找长度限定在某个范围内。, 这是哈希表所特有的特点。,2 Sort (排序),第 96 页,第 97 页

43、,什么是排序?,排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。,例如:将下列关键字序列,52, 49, 80, 36, 14, 58, 61, 23, 97, 75,调整为,14, 23, 36, 49, 52, 58, 61 ,75, 80, 97,第 98 页,一般情况下, 假设含n个记录的序列为 R1, R2, , Rn 其相应的关键字序列为 K1, K2, ,Kn ,这些关键字相互之间可以进行比较,即在 它们之间存在着这样一个关系 :Kp1Kp2Kpn,按此固有关系将上式记录序列重新排列为 Rp1, Rp2, ,Rp3 的操作称作排序。,第

44、 99 页,内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序;,反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。,第 100 页,内部排序的方法,内部排序的过程是一个逐步扩大 有序记录序列长度(同时也缩小无序序列长度)的过程。,经过一趟排序后,有序序列区,无 序 序 列 区,有序序列区,无 序 序 列 区,第 101 页,排序方法的稳定性能,1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。否则,称这种排序方法为不稳定的。,排序之前 : Ri(K

45、) Rj(K) ,排序之后 : Ri(K) Rj(K) ,例如:排序前 ( 56, 34, 47*, 23, 66, 18, 82, 47 ),若采用某种排序方法排序后得到结果:( 18, 23, 34, 47, 47*, 56, 66, 82 ) 则可确定该排序方法是不稳定的。,第 102 页,2. 稳定的排序方法对所有实例均具有同样效果;不稳定的排序方法则不能保证所有实例均具有同样效果,但至少能举出一个排序实例体现其不稳定(或者说,只要有一个反例就可证明算法的不稳定)。,例如 : 对 4*, 3, 4, 2 进行快速排序,得到 2, 3, 4, 4* ,说明快速排序是不稳定的排序方法。,第

46、 103 页,基于不同的“扩大” 有序序列长度的方法,内部排序方法大致可分下列几种类型:,插入类,交换类,选择类,归并类,其它方法,第 104 页,1. 交换类,通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。,第 105 页,冒泡排序方法,第 106 页,冒泡排序例子,第 107 页,初始序列:45* 23 32 39 50 88 05 66 451 2 3 4 5 6 7 8 9 交换次数 swap 第1趟:23 32 39 45* 50 05 66 45 88 6 1 第2趟:23 32 39 45* 05 50 45 66 88 2 1 第3趟:23 32 39 05 45* 45 50 66 88 2 1 第4趟:23 32 05 39 45* 45 50 66 88 1 1 第5趟:23 05 32 39 45* 45 50 66 88 1 1 第6趟:05 23 32 39 45* 45 50 66 88 1 1 第7趟:05 23 32 39 45* 45 50 66 88 0 0最后结果:05 23 32 39 45* 45 50 66 88,冒泡排序的结束条件为:已经排序n1趟或者最近一趟没有进行“记录交换” (swap=0)。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报