《前面我们学习了三种基本数据结构.ppt》由会员分享,可在线阅读,更多相关《前面我们学习了三种基本数据结构.ppt(59页珍藏版)》请在三一办公上搜索。
1、前面我们学习了三种基本数据结构:,一般线性表(数据元素、关系、操作无限制)栈和队列(操作有限制)字符串(数据元素有限制)广义表和数组(参与关系有限制)树和二叉树结构图结构,ADT的定义:数据结构的逻辑特性;数据结构上定义的操作;ADT的虚拟实现:逻辑结构的虚拟实现(存储结构)操作的虚拟实现(算法);ADT应用举例:,讲授的方法:,前面学习的每一种数据结构都定义了一些常用的操作,如:初始化、访问某数据元素等等,因此,研究操作的实现(不是操作的定义)即算法也是数据结构的范畴。,有两个操作在每个数据结构上、在计算机应用中是非常重要的:其一,确定元素的位置查找;其二,将元素按某种顺序排列分类后面两章我
2、们分别学习这两类操作的算法(思想、效率、优缺点等等);,第九章 查找,本章学习各种查找算法,了解算法的思想、效率、优缺点、适用范围等等。,预备知识,1、查找:在某一数据集合中查找数据元素是否存 在,若存在,返回其位置,否则,返回 失败信息。,2、查找表:被查找数据元素的集合(一般都是一 种数据结构,元素的位置是指在该数 据结构中的逻辑位置,但是查找方法 还依赖与元素的存储,即与存储结构 有关),一般是虚拟实现了的逻辑结 构(数据结构+存储结构)。,3、查找表的种类:静态查找表:数据集合在查找前后不变;动态查找表:数据集合在查找后会改变;,注意:查找表一般可以描述为:数据对象D0:D0是具有相同
3、特性的数据元素的 集合。每个数据元素含有类型相 同的关键字,可唯一标识数据元 素。数据关系R:数据元素同属一个集合(关系描述)。,4、查找方法:查找表不同,查找方法就会不同。有很多不同的查找方法。,5、查找算法的评价:空间:占用的辅助空间少;时间:时间少。查找的基本操作是比较,因此 时间主要体现为比较次数。,查找成功:最大比较次数MSL 平均比较次数ASL,查找失败:最大比较次数MSL 平均比较次数ASL,9.1 静态查找表的查找,静态查找表有很多种,查找方法也不一样,下面介绍几种常见的静态查找表的查找方法。,一、静态查找表是顺序或链式存储的线性表 顺序查找,1、查找表的要求:线性表,2、查找
4、方法:略,1、查找表的要求:,3、特点:思想简单,对查找表要求少,适应面广;比较次数较大O(n);(考虑查找概率不相等时应该如何处理?),二、静态查找表是顺序存储的、有序的线性表 折半查找(Fibonacci查找、插值查找),1、查找表的要求:顺序存储、有序的线性表,2、查找方法:,x=Rmid OK!xRmid mid+1hig,R,3、特点:对查找表要求多;比较次数较少O(log2n);,折半查找的过程可以用一棵二叉树表示,称之为“折半查找的判定树”。(构造方法自己总结,该树是唯一的吗?)例如:折半查找在n=11 时的判定树如下:,一般情况下,表长为n的折半查找的判定树的深度和含有n个结点
5、的完全二叉树的深度相同。假设 n=2h-1 并且查找概率相等则:,在n50时,可得近似结果:,三、静态查找表是树 静态树查找,1、查找表的要求:二叉分类树,2、查找方法:,X与根比较:相等:OK!X根:在右子树上找,3、特点:类似折半,最大是树的深度;等概率时,折半查找的判定树是最好的;不等概率时,概率高的应该靠近根。,四、静态查找表是分块索引表 分块查找,1、查找表的要求:顺序存储、分块有序,2、查找方法:,折半方法确定可能在的块;顺序查找确定元素;,3、特点:要建立索引表;效率介于折半和顺序之间;,9.2 动态查找表的查找 动态二叉分类树的查找,1、查找表的要求:二叉分类树,2、查找方法:
6、,若二叉排序树为空,则查找不成功;否则1)若给定值等于根结点的关键字,则查找成功;2)若给定值小于根结点的关键字,则继续在左 子树上进行查找;3)若给定值大于根结点的关键字,则继续在右 子树上进行查找。,Btreenode*find(Btreenode*BST,elentype x)/在以BST为根指针的二叉排队 树中查找值为x的结点 if(BST=NULL)return NULL;/查找失败 else if(BST-data=x)/查找成功 return BST;else if(BST-datax)/进入左子树查找 return find(BST-left,x);else/进入右子树查找 r
7、eturn find(BST-right,x);,3、特点:与树的深度有关;,对于每一棵特定的二叉排序树,均可按照平均查找长度的定义来求它的ASL值,显然,由值相同的n个关键字构造所得的,不同形态的各棵二叉排序树的平均查找长度的值不同,甚至可能差别很大,例如:由关键字序列1,2,3,4,5构造而得的二叉排序树,ASL=(1+2+3+4+5)/5=3由关键字序列3,1,2,5,4构造而得的二叉排序树,ASL=(1+2+3+2+3)/5=2.2,一般情况下,考虑含有n个关键字可能出现的n!种序列出现的可能性相等。不失一般性,假设某个序列中有k个关键字小于第一个关键字,即有n-k-1个关键字大于第一
8、个关键字,由它构造的二叉排序树的平均查找长度是n和k的函数:P(n,k)(0kn-1),则含n个关键字的二叉排序树的平均查找长度:,而在等概率的情况下,,由此:,可类似于解差分方程,此递归方程有解:,从查找的角度看,希望由任意序列生成的二叉排序树,其左、右子树的深度近似相等,但实际上有47%的情况生成的二叉排序树非如此。那么,如何构造高度比较低的二叉分类树呢?,9.3 平衡二叉树,一、平衡二叉树的定义,1、定义:一棵分类二叉树是平衡的,当且仅当每个结点的左右子树的高度至多相差为1。由G.M.Adelson_Velskii和E.M.Landis给出的定义AVL树。,递归定义:()空树是二叉分类树
9、;()它的左右子树都是二叉分类树,且左右子树的高度最多相差为;,、平衡因子:左子树的高度右子树的高度,即 BF(t)=Hl-Hr 平衡二叉树中,对任意结点:BF=、,、平衡二叉树的特点:其深度和log2n同数量级,即树的平均查找长度为O(log2n);,4、AVL树的构造和调整过程:,()基本原则:按照二叉分类树的构造方法,构造过程中判断是否为平衡二叉树(平衡因子),是,则继续构造;否则,按一定的原则(保持是二叉分类和平衡)将其调整为平衡,然后继续。,()插入过程中的调整原则:二叉分类树在插入前平衡,插入一个结点后如果失去平衡,则至少有一个结点的平衡因子变为或。若平衡因子,则左分支高于右分支;
10、若平衡因子,则右分支高于左分支;,失去平衡的四种情况:,型:左分支的左子树上插入,使之失去平衡因子平衡因子;,特殊地:,型:右分支的右子树上插入,使之失去平衡因子平衡因子;,特殊地:,型:左分支的右子树上插入,使之失去平衡因子平衡因子;,特殊地:,L型:右分支的左子树上插入,使之失去平衡因子平衡因子;,特殊地:,略(参见教材236-238),5、算法:,6、举例:有下列元素,构造平衡二叉树 13,24,37,90,53,13,24,37,RR型,24,13,37,13,24,37,90,53,90,53,RL型,24,13,37,53,90,53,37,90,9.3 平衡二叉树,二、平衡二叉树
11、的查找,1、查找过程:同二叉分类树一样!,、效率分析:查找过程中和给定值进行比较的关键字的个数不超过平衡树的深度。假设深度为h的二叉平衡树上所含结点数的最小值为Nh,则显然 Nh=Nh-1+Nh-2+1由此可以推导出:hlog(n)因此,在平衡树上进行查找的时间复杂度为O(log(n),9.4 哈希查找,一、哈希技术介绍,1、哈希技术的提出背景:,一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。,“哈希”是英文HASH的
12、音译,又翻译作“散列”、“杂凑”等。,那么,有没有不用比较的查找方法?,9.4 哈希查找,理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。,因此,如果有一个函数,它能够根据要查找的关键字直接计算出要查找记录的地址,该地址的内容为空,则查找的元素不存在,否则,查找成功。显然,这样的查找不需要比较!,基于这种思想的技术就是HASH技术;,9.4 哈希查找,哈希表最常见的例子是以学生学号为关键字的成绩表,号学生的记录位置在第一条,2号学生的记录位置在第二条,号学生的记录位置在第条.,如果我们以学生姓名为
13、关键字,如何建立查找表,使得根据姓名可以直接找到相应记录呢?,其次,我们取姓名各个字的拼音字头字母的编号和为该记录的存储位置,例如吴军,wj=33,存储位置33;吴晓燕,wxy=72,存储位置为72;,首先,我们规定每个字母的编号:,9.4 哈希查找,显然存储地址从378。如果76个学生的姓名的拼音字头字母都互不相同,则我们可以按这种方式存储这些学生的信息,而且很容易的查找一个学生的信息。,例如:要查吴晓燕的信息,则计算wxy=72,第72个位置存储的就是该学生的信息。,如果我们有m个空间,n个数据元素,n=m,且每个数据元素能按某种映射关系得到唯一的空间地址,则我们很容易的实现查找!,但是,
14、千万不要忘了我们假设的前提:互不相同!,例如,如果学生中还有一个学生姓名为王新云,wxy=72怎么办?,9.4 哈希查找,一、哈希技术介绍,2、什么情况下使用HASH技术?,如果问题的数据元素已知,很容易地建立数据元素和存储地址之间的一一映射函数关系,HASH技术是很简单的,HASH技术也就失去了意义,实际上HSAH技术是针对下类问题的:,问题的数据元素的可用集合很大,而一个问题的具体数据元素是取自该可用集合的一个很小的任意一个集合,因此,解决问题时需要的空间大小是根据小集合大小确定的,但是,如果要建立函数映射,函数的定义域应该是大集合,而值域是由小集合确定的,因此建立这样的一一映射是很困难的
15、,所以才有了HASH技术。,9.4 哈希查找,一、哈希技术介绍,3、HASH类问题的描述:,假设问题可能用到的关键字集合为U,|U|=n0,即该集合的元素个数为n0,而一个问题实际用到的关键字集合为S,|S|=n,nn0,且S是取自U的任意一个子集合,表示为R1,R2,R3,.Rn,其关键字集合为K1,K2,.,Kn;T是解决问题需要的连续空间,它由m个存储单元组成,表示为T0.m-1,mn。,有一个函数H,其定义域是keyU,值域是i 0.m-1,它将关键字映射到存储空间地址上;H(key)=i key U,i0.m-1,9.4 哈希查找,一、哈希技术介绍,n,H,9.4 哈希查找,一、哈希
16、技术介绍,4、有关基本概念:,(1)HASH函数:将关键字映射到存储空间地址的函数,记作:H(key),(2)HASH地址:由HSAH函数计算出的关键字地址;,(3)HASH表:存储记录的连续地址空间T;,(4)HASH造表:利用HASH函数将记录存储到HASH表 中的过程;,(5)HASH表的填充度(装填因子):表中填入的记录数=HASH表的长度,9.4 哈希查找,一、哈希技术介绍,(6)冲突:由于HASH函数的定义域是U,而S是U的任 意一个小子集,映射地址空间是由S的大小 确定的,因此,对于不同的关键字可能得到 相同的HASH地址,即:若 key1key2,而 H(key1)=H(key
17、2),则称为 冲突。,(7)同义词:若 H(key1)=H(key2),则key1和key2互称 为同义词。,5、HASH技术的关键:,HASH函数的构造,解决冲突的方法,9.4 哈希查找,一、哈希技术介绍,5、HASH问题举例:,我们写程序时,可以用的标识符是一个很大集合(U)因为凡是符合语言词法定义的都是合法、可用的标识符,但是对于你写的每一个程序,真正使用到的标识符却是一个很小的子集(S),编译程序存储和处理程序时只要能存储和处理任意的小子集S即可,但是,要注意S的特点!,例如:标准PASCAL的标识符为字母开头的8个长度的字母数字串,则|U|=C(26,1)*C(36,1)*7=1.0
18、93881012,而一个程序中可能出现的标识符不会太多,1000足矣!即|S|=1000。,9.4 哈希查找,二、哈希函数的构造方法,1、直接定址法:H(key)=key 或 H(key)=a*key+b a,b为常数,特点:*关键字必须是整数;*地址集合和关键字集合大小相同,没有冲突;*空间浪费大;,2、数字分析法:H(key)=关键字的某进制的若干位组成,特点:*要求关键字已知;*取几位,哪几位的原则是尽量避免冲突,均匀性好;,9.4 哈希查找,3、平方取中法:H(key)=关键字平方后的中间几位,4、折叠法:H(key)=将关键字分割成位数相同的几部分,然后取 这几部分的叠加和(舍去进位
19、),特点:这是一种较常用的方法。*关键字不一定全部知道;*由于一个数平方后的中间几位和数的每一位相关,均匀性较好,取的位数与表长有关;*乘和截取的代价较高;,特点:*关键字位数很多,而且关键字中每一位上数字 分布大致均匀时,均匀性很好;,9.4 哈希查找,5、除留余法:H(key)=key MOD P P是不大于m的素数,m是 HASH表的长度;,6、随机数法:H(key)=Random(key);Random位随机函数,特点:这是一种最简单、最常用的方法。*P的选择很重要,选择不好会产生同义词;*P一般取位素数或不包含小于20的质数的合数;,HASH函数考虑的因素:(1)计算HASH函数的时
20、间;(2)关键字的长度;(3)HASH表的长度;(4)关键字的分布情况;(5)记录的查找频率;,9.4 哈希查找,三、冲突的解决方法,1、开放定址法:(闭散列)发生冲突后,按一定的原则寻找新的地址:Hi=(H(key)+di)MOD m i=1,2,.,k di为增量,m为HASH表的长度;di的取法:线性探测:di=1,2,3,.,m-1 二次探测:di=12,-12,22,-22,.,k2,解决冲突的策略分为两类:(1)闭散列方法(Closed Hashing):同义词放在HASH表 的其他位置;(Open addressing,又称为开地址法)(2)闭散列方法(Open Hashing)
21、:同义词放在HASH表 之外的空间中;(Separate chaining,又称为拉链法),9.4 哈希查找,三、冲突的解决方法,2、再造HASH法:(闭散列)Hi=RHi(key)用一系列HASH函数计算地址,3、链地址法:(开散列)将同义词存放在同一个链表中;,9.4 哈希查找,4、建立公共溢出区法:除了HASH表外,开辟一个公共溢出区,一旦冲突,将同义词放入公共溢出区;,HASH表:,溢出表:,9.4 哈希查找,四、哈希查找,1、哈希查找的方法,给定关键字 k:(1)用给定的HASH函数计算出k的HASH地址;i=H(key)(2)若该地址为空,则查找失败;否则,若 Ti=k,则查找成功
22、,返回地址;否则,按HASH造表时解决冲突时的 方法计算出新的地址;(3)重复(2)直到查找成功或失败。,9.4 哈希查找,、哈希查找的算法,参见教材259页,9.4 哈希查找,3、举例:,已知有一组元素:19,14,23,01,68,20,84,27,55,11,10,79HASH函数为:H(key)=key MOD 13,HASH表长度为16,构造HASH表,(1)线性探测法解决冲突 Hi=(H(key)+di)MOD 15 di=1,2,3,.,m-1,关键字:,19,14,23,01,68,20,84,27,55,11,10,79,地 址:,6,1,10,1,3,7,6,1,3,11,
23、10,1,19,HASH表:,14,23,01,01,68,20,84,84,84,27,27,27,27,55,55,55,11,10,10,10,79,79,79,79,79,79,79,79,79,9.4 哈希查找,(2)二次探测法解决冲突 Hi=(H(key)+di)MOD 15 di=12,-12,22,-22,.,k2(km/2),关键字:,19,14,23,01,68,20,84,27,55,11,10,79,地 址:,6,1,10,1,3,7,6,1,3,11,10,1,19,HASH表:,14,23,01,68,20,84,11,10,84,84,27,27,55,55,10,10,79,79,79,79,79,01,27,79,79,79,9.4 哈希查找,(3)链地址法解决冲突,关键字:,19,14,23,01,68,20,84,27,55,11,10,79,地 址:,6,1,10,1,3,7,6,1,3,11,10,1,HASH表:,19,14,23,14,01,68,20,84,27,55,68,11,10,23,79,9.4 哈希查找,4、性能分析:,若没有冲突:O(1);有冲突,性能与下列因素有关:HASH函数 解决冲突的方法 装填因子,本章结束,
链接地址:https://www.31ppt.com/p-5386898.html