前面我们学习了三种基本数据结构.ppt_第1页
前面我们学习了三种基本数据结构.ppt_第2页
前面我们学习了三种基本数据结构.ppt_第3页
前面我们学习了三种基本数据结构.ppt_第4页
前面我们学习了三种基本数据结构.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

前面我们学习了三种基本数据结构:,一般线性表(数据元素、关系、操作无限制) 栈和队列(操作有限制) 字符串(数据元素有限制) 广义表和数组(参与关系有限制) 树和二叉树结构 图结构,ADT的定义: 数据结构的逻辑特性; 数据结构上定义的操作; ADT的虚拟实现: 逻辑结构的虚拟实现(存储结构) 操作的虚拟实现(算法); ADT应用举例:,讲授的方法:,前面学习的每一种数据结构都定义了一 些常用的操作,如:初始化、访问某数 据元素等等,因此,研究操作的实现( 不是操作的定义)即算法也是数据结构 的范畴。,有两个操作在每个数据结构上、在计算 机应用中是非常重要的: 其一,确定元素的位置查找; 其二,将元素按某种顺序排列分类 后面两章我们分别学习这两类操作的算 法(思想、效率、优缺点等等);,第九章 查找,本章学习各种查找算法,了解算法的思想、 效率、优缺点、适用范围等等。,预备知识,1、查找:在某一数据集合中查找数据元素是否存 在,若存在,返回其位置,否则,返回 失败信息。,2、查找表:被查找数据元素的集合(一般都是一 种数据结构,元素的位置是指在该数 据结构中的逻辑位置,但是查找方法 还依赖与元素的存储,即与存储结构 有关),一般是虚拟实现了的逻辑结 构(数据结构+存储结构)。,3、查找表的种类: 静态查找表:数据集合在查找前后不变; 动态查找表:数据集合在查找后会改变;,注意: 查找表一般可以描述为: 数据对象D0:D0是具有相同特性的数据元素的 集合。每个数据元素含有类型相 同的关键字,可唯一标识数据元 素。 数据关系R:数据元素同属一个集合(关系描述)。,4、查找方法: 查找表不同,查找方法就会不同。有很多不同 的查找方法。,5、查找算法的评价: 空间:占用的辅助空间少; 时间:时间少。查找的基本操作是比较,因此 时间主要体现为比较次数。,查找成功: 最大比较次数MSL 平均比较次数ASL,查找失败: 最大比较次数MSL 平均比较次数ASL,9.1 静态查找表的查找,静态查找表有很多种,查找方法也不一样, 下面介绍几种常见的静态查找表的查找方法。,一、静态查找表是顺序或链式存储的线性表 顺序查找,1、查找表的要求:线性表,2、查找方法:略,1、查找表的要求:,3、特点: 思想简单,对查找表要求少,适应面广; 比较次数较大O(n); (考虑查找概率不相等时应该如何处理?),二、静态查找表是顺序存储的、有序的线性表 折半查找(Fibonacci查找、插值查找),1、查找表的要求:顺序存储、有序的线性表,2、查找方法:,x=Rmid OK! xRmid mid+1hig,R,3、特点: 对查找表要求多; 比较次数较少O(log2n);,折半查找的过程可以用一棵二叉树表示,称之为 “折半查找的判定树”。(构造方法自己总结, 该树是唯一的吗?) 例如: 折半查找在n=11 时的判定树如下:,一般情况下,表长为n的折半查找的判定树的深度和 含有n个结点的完全二叉树的深度相同。 假设 n=2h-1 并且查找概率相等则:,在n50时,可得近似结果:,三、静态查找表是树 静态树查找,1、查找表的要求:二叉分类树,2、查找方法:,X与根比较: 相等: OK! X根: 在右子树上找,3、特点: 类似折半,最大是树的深度; 等概率时,折半查找的判定树是最好的; 不等概率时,概率高的应该靠近根。,四、静态查找表是分块索引表 分块查找,1、查找表的要求:顺序存储、分块有序,2、查找方法:,折半方法确定可能在的块; 顺序查找确定元素;,3、特点: 要建立索引表; 效率介于折半和顺序之间;,9.2 动态查找表的查找 动态二叉分类树的查找,1、查找表的要求:二叉分类树,2、查找方法:,若二叉排序树为空,则查找不成功;否则 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 /进入右子树查找 return 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个关键字大于第一个关键 字,由它构造的二叉排序树的平均查找长度是n和 k的函数: P(n, k) (0kn-1),则含n个关键字的二叉排序树的平均查找长度:,而在等概率的情况下,,由此:,可类似于解差分方程,此递归方程有解:,从查找的角度看,希望由任意序列生成的二叉 排序树,其左、右子树的深度近似相等,但实际 上有47%的情况生成的二叉排序树非如此。 那么,如何构造高度比较低的二叉分类树呢?,9.3 平衡二叉树,一、平衡二叉树的定义,1、定义:一棵分类二叉树是平衡的,当且仅当每个结点 的左右子树的高度至多相差为1 。由G.M.Adelson_Velskii 和E.M.Landis给出的定义AVL树。,递归定义: ()空树是二叉分类树; ()它的左右子树都是二叉分类树,且左右子树 的高度最多相差为;,、平衡因子: 左子树的高度右子树的高度,即 BF(t)=Hl-Hr 平衡二叉树中,对任意结点:BF=、 ,、平衡二叉树的特点: 其深度和log2n同数量级,即树的平均查找长度 为O(log2n);,4、AVL树的构造和调整过程:,()基本原则: 按照二叉分类树的构造方法,构造过程中判断是否 为平衡二叉树(平衡因子),是,则继续构造;否则, 按一定的原则(保持是二叉分类和平衡)将其调整为平 衡,然后继续。,()插入过程中的调整原则: 二叉分类树在插入前平衡,插入一个结点后如果失去 平衡,则至少有一个结点的平衡因子变为或。 若平衡因子,则左分支高于右分支; 若平衡因子,则右分支高于左分支;,失去平衡的四种情况:,型:左分支的左子树上插入,使之失去平衡因子 平衡因子;,特殊地:,型:右分支的右子树上插入,使之失去平衡因子 平衡因子;,特殊地:,型:左分支的右子树上插入,使之失去平衡因子 平衡因子;,特殊地:,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 平衡二叉树,二、平衡二叉树的查找,1、查找过程:同二叉分类树一样!,、效率分析: 查找过程中和给定值进行比较的关键字的个数不 超过平衡树的深度。 假设深度为h的二叉平衡树上所含结点数的最小值 为Nh,则显然 Nh = Nh-1 + Nh-2 + 1 由此可以推导出:hlog(n) 因此,在平衡树上进行查找的时间复杂度为O(log(n),9.4 哈希查找,一、哈希技术介绍,1、哈希技术的提出背景:,一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。,“哈希”是英文HASH的音译,又翻译作“散列”、 “杂凑”等。,那么,有没有不用比较的查找方法?,9.4 哈希查找,理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。,因此,如果有一个函数,它能够根据要查找的关键字直接计算出要查找记录的地址,该地址的内容为空,则查找的元素不存在,否则,查找成功。显然,这样的查找不需要比较!,基于这种思想的技术就是HASH技术;,9.4 哈希查找,哈希表最常见的例子是以学生学号为关键字的成绩表,号学生的记录位置在第一条, 2号学生的记录位置在第二条, 号学生的记录位置在第条.,如果我们以学生姓名为关键字,如何建立查找表,使得根据姓名可以直接找到相应记录呢?,其次,我们取姓名各个字的拼音字头字母的编号和为该 记录的存储位置,例如吴军,wj=33,存储位置33; 吴晓燕,wxy=72,存储位置为72;,首先,我们规定每个字母的编号:,9.4 哈希查找,显然存储地址从378。如果76个学生的姓名的拼音字头字母都互不相同,则我们可以按这种方式存储这些学生的信息,而且很容易的查找一个学生的信息。,例如:要查吴晓燕的信息,则计算wxy=72,第72个位置存储的就是该学生的信息。,如果我们有m个空间,n个数据元素,n=m,且每个 数据元素能按某种映射关系得到唯一的空间地址,则 我们很容易的实现查找!,但是,千万不要忘了我们假设的前提: 互不相同!,例如,如果学生中还有一个学生姓名为王新云,wxy=72 怎么办?,9.4 哈希查找,一、哈希技术介绍,2、什么情况下使用HASH技术?,如果问题的数据元素已知,很容易地建立数据元素 和存储地址之间的一一映射函数关系,HASH技术是很 简单的,HASH技术也就失去了意义,实际上HSAH技 术是针对下类问题的:,问题的数据元素的可用集合很大,而一个问题的 具体数据元素是取自该可用集合的一个很小的任意一 个集合,因此,解决问题时需要的空间大小是根据小 集合大小确定的,但是,如果要建立函数映射,函数 的定义域应该是大集合,而值域是由小集合确定的, 因此建立这样的一一映射是很困难的,所以才有了HASH 技术。,9.4 哈希查找,一、哈希技术介绍,3、HASH类问题的描述:,假设问题可能用到的关键字集合为U,|U|=n0,即该集合 的元素个数为n0,而一个问题实际用到的关键字集合为S, |S|=n,nn0,且S是取自U的任意一个子集合,表示 为R1,R2,R3,.Rn,其关键字集合为K1,K2,.,Kn; T是解决问题需要的连续空间,它由m个存储单元组成, 表示为T0m-1,mn。,有一个函数H,其定义域是keyU,值域是i 0m-1, 它将关键字映射到存储空间地址上; H(key)= i key U, i0m-1,9.4 哈希查找,一、哈希技术介绍,n,H,9.4 哈希查找,一、哈希技术介绍,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(key2),则称为 冲突。,(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.093881012,而 一个程序中可能出现的标识符不会太多,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)=将关键字分割成位数相同的几部分,然后取 这几部分的叠加和(舍去进位),特点:这是一种较常用的方法。 * 关键字不一定全部知道; * 由于一个数平方后的中间几位和数的每一位相关, 均匀性较好,取的位数与表长有关; * 乘和截取的代价较高;,特点: * 关键字位数很多,而且关键字中每一位上数字 分布大致均匀时,均匀性很好;,9.4 哈希查找,5、除留余法: H(key)= key MOD P P是不大于m的素数,m是 HASH表的长度;,6、随机数法: H(key)= Random(key); Random位随机函数,特点:这是一种最简单、最常用的方法。 * P的选择很重要,选择不好会产生同义词; * P一般取位素数或不包含小于20的质数的合数;,HASH函数考虑的因素: (1)计算HASH函数的时间; (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):同义词放在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 ,则查找成功,返回地址; 否则,按HASH造表时解决冲突时的 方法计算出新的地址; (3)重复(2)直到查找成功或失败。,9.4 哈希查找,、哈希查找的算法,参见教材259页,9.4 哈希查找,3、举例:,已知有一组元素:19,14,23,01,6

温馨提示

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

评论

0/150

提交评论