数据结构 9查找c

上传人:今*** 文档编号:107385477 上传时间:2019-10-19 格式:PPT 页数:22 大小:303.50KB
返回 下载 相关 举报
数据结构 9查找c_第1页
第1页 / 共22页
数据结构 9查找c_第2页
第2页 / 共22页
数据结构 9查找c_第3页
第3页 / 共22页
数据结构 9查找c_第4页
第4页 / 共22页
数据结构 9查找c_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《数据结构 9查找c》由会员分享,可在线阅读,更多相关《数据结构 9查找c(22页珍藏版)》请在金锄头文库上搜索。

1、9.3 哈希表查找,一、哈希表的概念 二、哈希函数的构造方法 三、冲突处理方法 四、哈希表的查找及分析,一、哈希表的概念,哈希表:即散列存储结构。 散列法存储的基本思想:建立关键码字与其存储位置的对应关系,或者说,由关键码的值决定数据的存储地址。 优点:查找速度极快(O(1)),查找效率与元素个数n无关!,例1:若将学生信息按如下方式存入计算机,如: 将2001011810201的所有信息存入V01单元; 将2001011810202的所有信息存入V02单元; 将2001011810231的所有信息存入V31单元。,欲查找学号为2001011810216的信息,便可直接访问V16!,例2 :,

2、有数据元素序列(14,23,39,9,25,11),若规定每个元素k的存储地址H(k)k,请画出存储结构图。 (注:H(k)k称为散列函数),解:根据散列函数H(k)k ,可知元素14应当存入地址为14的单元,元素23应当存入地址为23的单元, 对应散列存储表(哈希表)如下:,讨论:如何进行散列查找? 根据存储时用到的散列函数H(k)表达式,迅即可查到结果! 例如,查找key=9,则访问H(9)=9号地址,若内容为9则成功; 若查不到,应当设法返回一个特殊值,例如空指针或空记录。,14,11,9,23,25,39,缺点:空间效率低!,选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放

3、;查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比,确定查找是否成功。,通常关键码的集合比哈希地址集合大得多,因而经过哈希函数变换后,可能将不同的关键码映射到同一个哈希地址上,这种现象称为冲突。,若干术语,哈希方法(杂凑法) 哈希函数(杂凑函数) 哈希表 (杂凑表) 冲 突,哈希方法中使用的转换函数称为哈希函数(杂凑函数),按上述思想构造的表称为哈希表(杂凑表),有6个元素的关键码分别为:(14,23,39,9,25,11)。 选取关键码与元素位置间的函数为H(k)=k mod 7,通过哈希函数对6个元素建立哈希表:,25,39,23,9,14,冲突现象举例:,6个元素

4、用7个 地址应该足够!,H(14)=14%7=0,11,H(25)=25%7=4 H(11)=11%7=4,有冲突!,所以,哈希方法必须解决以下两个问题:,1)构造好的哈希函数 (a)所选函数尽可能简单,以便提高转换速度; (b)所选函数对关键码计算出的地址,应在哈希地址集中大致均匀分布,以减少空间浪费。,2)制定一个好的解决冲突的方案 查找时,如果从哈希函数计算出的地址中查不到关键码,则应当依据解决冲突的规则,有规律地查询其它相关单元。,在哈希查找方法中,冲突是不可能避免的,只能尽可能减少。,二、哈希函数的构造方法,常用的哈希函数构造方法有:,直接定址法 除留余数法 乘余取整法 数字分析法

5、平方取中法 折叠法 随机数法,要求一:n个数据原仅占用n个地址,虽然散列查找是以空间换时间,但仍希望散列的地址空间尽量小。 要求二:无论用什么方法存储,目的都是尽量均匀地存放元素,以避免冲突。,Hash(key) = akey + b (a、b为常数) 优点:以关键码key的某个线性函数值为哈希地址,不会产生冲突. 缺点:要占用连续地址空间,空间效率低。,例:关键码集合为100,300,500,700,800,900, 选取哈希函数为Hash(key)=key/100, 则存储结构(哈希表)如下:,1、直接定址法,Hash(key)= B*( A*key mod 1 ) (A、B均为常数,且0

6、A1,B为整数) 特点:以关键码key乘以A,取其小数部分,然后再放大B倍并取整,作为哈希地址。,Hash(key)=key mod p (p是一个整数) 特点:以关键码除以p的余数作为哈希地址。 关键:如何选取合适的p? 技巧:若设计的哈希表长为m,则一般取pm且为质数 (也可以是不包含小于20质因子的合数)。 自练:自测卷简答题第4小题,3、乘余取整法,2、除留余数法,(A*key mod 1) 就是取A*key 的小数部分,例:欲以学号最后两位作为地址,则哈希函数应为: H(k)=100*(0.01*k % 1 ) 其实也可以用法2实现: H(k)=k % 100,特点:某关键字的某几位

7、组合成哈希地址。所选的位应当是:各种符号在该位上出现的频率大致相同。,3 4 7 0 5 2 4 3 4 9 1 4 8 7 3 4 8 2 6 9 6 3 4 8 5 2 7 0 3 4 8 6 3 0 5 3 4 9 8 0 5 8 3 4 7 9 6 7 1 3 4 7 3 9 1 9,例:有一组(例如80个)关键码,其样式如下:,4、数字分析法,讨论: 第1、2位均是“3和4”,第3位也只有“ 7、8、9”,因此,这几位不能用,余下四位分布较均匀,可作为哈希地址选用。,位号: , 若哈希地址取两位(因元素仅80个),则可取这四位中的任意两位组合成哈希地址,也可以取其中两位与其它两位叠加

8、求和后,取低两位作哈希地址。,特点:对关键码平方后,按哈希表大小,取中间的若干位作为哈希地址。 理由:因为中间几位与数据的每一位都相关。 例:2589的平方值为6702921,可以取中间的029为地址。,6、折叠法,特点:将关键码自左到右分成位数相等的几部分(最后一部分位数可以短些),然后将这几部分叠加求和,并按哈希表表长,取后几位作为哈希地址。 适用于:每一位上各符号出现概率大致相同的情况。 法1:移位法 将各部分的最后一位对齐相加。 法2:间界叠加法从一端向另一端沿分割界来回折叠后,最后一位对齐相加。 例:元素42751896, 用法1: 42751896=1041 用法2: 427 51

9、8 96 724+518+69 =1311,5、平方取中法,7、随机数法,Hash(key) = random ( key ) (random为伪随机函数) 适用于:关键字长度不等的情况。造表和查找都很方便。, 执行速度(即计算哈希函数所需时间); 关键字的长度; 哈希表的大小; 关键字的分布情况; 查找频率。,小结:构造哈希函数的原则:,三、冲突处理方法,常见的冲突处理方法有:,开放定址法(开地址法) 链地址法(拉链法) 再哈希法(双哈希函数法) 建立一个公共溢出区,1、开放定址法(开地址法),设计思路:有冲突时就去寻找下一个空的哈希地址,只要哈希表足够大,空的哈希地址总能找到,并将数据元素

10、存入。,具体实现:,Hi=(Hash(key)+di) mod m ( 1i m ) 其中: Hash(key)为哈希函数 m为哈希表长度 di 为增量序列 1,2,m-1,且di=i,1.线性探测法,含义:一旦冲突,就找附近(下一个)空地址存入。,关键码集为 47,7,29,11,16,92,22,8,3, 设:哈希表表长为m=11; 哈希函数为Hash(key)=key mod 11; 拟用线性探测法处理冲突。建哈希表如下:,解释: 47、7(以及11、16、92)均是由哈希函数得到的没有冲突的哈希地址;,0 1 2 3 4 5 6 7 8 9 10, ,例:,29,22,8,3, Has

11、h(29)=7,哈希地址有冲突,需寻找下一个空的哈希地址:由H1=(Hash(29)+1) mod 11=8,哈希地址8为空,因此将29存入。, 另外,22、8、3同样在哈希地址上有冲突,也是由H1找到空的哈希地址的。,其中3 还连续移动了两次(二次聚集),线性探测法的优点:只要哈希表未被填满,保证能找到一个空地址单元存放有冲突的元素; 线性探测法的缺点:可能使第i个哈希地址的同义词存入第i+1个哈希地址,这样本应存入第i+1个哈希地址的元素变成了第i+2个哈希地址的同义词, 因此,可能出现很多元素在相邻的哈希地址上“堆积”起来,大大降低了查找效率。 解决方案:可采用二次探测法或伪随机探测法,

12、以改善“堆积”问题。,讨论:,仍举上例,改用二次探测法处理冲突,建表如下:,0 1 2 3 4 5 6 7 8 9 10, ,注:只有3这个关键码的冲突处理与上例不同, Hash(3)=3,哈希地址上冲突,由 H1=(Hash(3)+12) mod 11=4,仍然冲突; H2=(Hash(3)-12) mod 11=2,找到空的哈希地址,存入。,2. 二次探测法,Hi=(Hash(key)di) mod m 其中:Hash(key)为哈希函数 m为哈希表长度,m要求是某个4k+3的质数; di为增量序列 12,-12,22,-22,q2,3. 若di伪随机序列,就称为伪随机探测法,2、链地址法

13、(拉链法),基本思想:将具有相同哈希地址的记录链成一个单链表,m个哈希地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构。,设 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89 的哈希函数为: Hash(key)=key mod 11, 用拉链法处理冲突,则建表如右图所示。,例:,注:有冲突的元素可以插在表尾,也可以插在表头,3、再哈希法(双哈希函数法),Hi=RHi(key) i=1, 2, ,k RHi均是不同的哈希函数,当产生冲突时就计算另一个哈希函数,直到冲突不再发生。 优点:不易产生聚集; 缺点:增加了计算时间。

14、,4. 建立一个公共溢出区,思路:除设立哈希基本表外,另设立一个溢出向量表。 所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得到的地址是什么,一旦发生冲突,都填入溢出表。,四、哈希表的查找及分析,明确:散列函数没有“万能”通式,要根据元素集合的特性而分别构造。 算法:见教材P259 讨论:哈希查找的速度是否为真正的O(1)? 不是。由于冲突的产生,使得哈希表的查找过程仍然要进行比较,仍然要以平均查找长度ASL来衡量。 一般地,ASL依赖于哈希表的装填因子,它标志着哈希表的装满程度。, 越大,表中记录数越多,说明表装得越满,发生冲突的可能性就越大,查找时比较次数就越多。,01,讨论:,2)“冲突”是不是特别讨厌? 答:不一定!正因为有冲突,使得文件加密后无法破译(不可逆,是单向散列函数,可用于数字签名)。 利用了哈希表性质:源文件稍稍改动,会导致哈希表变动很大。,1) 散列存储的查找效率到底是多少? 答:ASL与装填因子有关!既不是严格的O(1),也不是O(n),应尽量选择一个合适的,以降低ASL的长度,本章小结,重点:顺序查找、二分查找、二叉排序树上查找以及散列表上查找的基本思想和算法实现。,难点:二叉排序树的删除算法,

展开阅读全文
相关资源
相关搜索

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

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号