收藏 分享(赏)

数据结构 第九章 查找-哈希表.ppt

上传人:精品资料 文档编号:11292929 上传时间:2020-03-12 格式:PPT 页数:35 大小:543.50KB
下载 相关 举报
数据结构 第九章 查找-哈希表.ppt_第1页
第1页 / 共35页
数据结构 第九章 查找-哈希表.ppt_第2页
第2页 / 共35页
数据结构 第九章 查找-哈希表.ppt_第3页
第3页 / 共35页
数据结构 第九章 查找-哈希表.ppt_第4页
第4页 / 共35页
数据结构 第九章 查找-哈希表.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、,9.3 哈希表,哈希表举例回顾,假定某教室有35个座位,如果不加限定让学生任意就座,则要找某个学生时就要将待找学生与当前座位上的学生一一做比较,这就是我们前面所介绍的查找方法的大致思路。而哈希法则要限定学生所坐的位置,比如可规定学生座位的编号应与其学号的末两位相同,则学号为993605的学生应坐编号为5的座位。这样我们要找某个学生时只需根据其学号的末两位到相应座位上去找即可,不必一一比较了。在这个例子里,学生好比记录,学号则为关键字,对关键字进行的操作则是取其末两位,用以确定记录的位置。,哈希表概念回顾,哈希查找因使用哈希(Hash)函数而得名。哈希函数又叫散列函数,是一种能把关键字映射成记

2、录存储地址的函数。假定数组HT0m-1为存储记录的地址空间,m为表长。哈希函数H以记录的关键字K为自变量,计算出对应的函数值H(k),并以它作为关键字K所标识的记录在表HT中的(相对)地址或索引号,这样产生的记录表HT叫做对应于哈希函数H的哈希表。,哈希表概念回顾,总之,在哈希表中,关键字为Key的记录,存储在HTH(Key)位置。习惯上,把哈希函数值H(Key)称为Key的哈希地址或散列地址。,哈希函数的构造方法回顾,(1)直接定址法,(2)平方取中法,(4)除留余数法,(3)数字分析法,除留余数法,设给出的关键字值为Key,存储区单元数为m,则用一个小于m的质数P去除Key,得到的余数为R

3、,即: R=Key%P 如果R落在存储区地址范围内,则R就取为哈希函数值(散列地址);否则,再用一个线性数求出哈希函数值。,模(%)运算,例如:一组关键字从000001到859999,指定的存储区地址为1000000到1005999(m=6000),令P=599:若要转换关键字Key=172148,则有: R=172148%599=4176 因R不在指定的地址范围内,所以取哈希函数为: H(Key)=100000+Key%599 故有:H(Key)=H(172148)=1004176。 这样就把关键字Key直接转换成存储地址了。,P的选择,结论:若选择关键字内部代码基数的幂次来除关键字,其结果

4、必定是关键字的低位数字均匀性较差;若取P为任意偶数,则当关键字内部代码为偶数时,得到的哈希函数值为偶数;若关键字内部代码为奇数,则哈希函数值为奇数,即把一个元素只散列到一半的存储空间中。选P为奇数就不会出现这种情况,它能够把一个元素散列到整个存储空间。根据理论分折和试验结果,P应取小于存储区容量的素数。,若p含有质因子pf,则所有含有质因子pf的关键字的哈希地址均为pf的倍数:如当p=21=(3*7)时,下列含因子7的关键字对21取模的哈希地址均为7的倍数。,再例如若取 p=9, 则使所有含质因子3的关键字均映射到地址0, 3, 6 上,从而增加了“冲突”的可能性,例如,若n=100,则P最好

5、取23、79、97等素数。又若n=1000,则P最好取123、127、997等素数。 再例如,对关键字KEYA、KEYB、AKEY和BKEY,若表的存储区为000999,P应取小于1000的函数,如取P=997,则可得到以下结果: 关键字 Key H(Key)=Key%997 KEYA 11052501 756 KEYB 11052502 757 AKEY 01110525 864 BKEY 02110525 873 除留余数法是经常使用的。,根据下面的示例回答问题:一张BASIC语言语句符号表(语句定义符)。按哈希方法组织记录存储,先设定一个长度为m的哈希表HT,然后构造哈希函数H,按照关键

6、字值Key计算出各个记录的散列地址H(Key),并将这些记录存储到HTH(Key)中去。现设m=26,且有LET,GOT0,INPUT,FOR,NEXT,PRINT等7个记录。哈希函数为:H(Key)=ord(ch)一ord(A)十1 其中ch是关键字值Key的首字母,ord( )是英文字母中的序号。,H(Key)=ord(ch)一ord(A)十1,IF,9,冲突或碰撞,hash切碎的食物(肉丁、土豆丁等)大杂烩; 混杂, 乱七八糟重申, 复述; 推敲美俚传闻美俚麻醉品苏傻瓜 hash house 美俚廉价餐馆, 经济餐馆,冲突不是我们所希望的,而如何避免冲突则取决于哈希函数的构造。好的哈希函

7、数应使散列地址均匀地分布在哈希表的整个地址区间内,这样可以避免或减少发生冲突。哈希函数的构造并非是件容易做到的事,与关键字的长度、哈希表的大小、关键字的实际取值状况等许多因素有关,而且有的因素(如关键字的实际取值只知道范围)事前不能确定。哈希函数的构造或多或少带有杂凑的意味,取英文单词hash的“杂凑”之意。,冲突是很难避免的,其不可避免性具有它一定的内因。因为关键字的值域往往比哈希表的个数大的多,所以哈希函数是一种压缩映射,碰撞是难免的。例如,存储100个学生记录,尽管安排120个地址空间,要找到一个哈希函数把100个任意的学生名映射成0119内的不同整数,实际上是不可能的。,问题在于一旦发

8、生了冲突应如何处理?,解决冲突的主要方法 :(1)开放地址法 为了便于发现冲突和溢出,首先要对哈希表HT0m-1进行初始化,置表中每个位置为NULL。就关键字而言,它表示不属于关键字值域的一种特定的特殊符号。 假定记录Ri和Rj的关键字分别为Ki和Kj,而有HKi=HKj=t时,则说发生了冲突。如果Ri已装入HTt中,那么Rj就不能再装入HTt中,但只要HT中还有空位,总可以把Ri存入HTt的“下一个”空位上。寻找“下一个”空位的过程称为探测。下面介绍两种探测方法。,a、线性深测法 线性探测法的基本思想是:如果在位置t上发生冲突,则从位置t+1开始,顺序查找哈希表HT,找一个最靠近的空位,把待

9、插入的新记录装入这个空位上。顺序查找时,我们把哈希表HT0m-1看成是一个循环表,即如果到达HTm-1还没发现一个空位,则从HT0开始继续顺序查找,直至到达HTt,此时,如果仍未发现有空位,则说明哈希表已满,进行溢出处理。,a、线性深测法 线性探测算法描述:假定给定关键字值为Key,为了查找Key,首先计算出p=H(Key)(H是用除留余数法构造的哈希函数),如果HTp非空且HTpKey,则从第p+1个位置开始对HT进行循环探测,直到: (1)或者当前位置上的关键字值等于Key,表明查找成功; (2)或者找到一个空位置,表明查找不成功,将Key插入到该位置; (3)或者既末查到又没有空位置,应

10、转向对溢出的处理。,线性探查示例:,已知一组关键码为(26,36,41,38,44,15,68,12,06,51,25),散列表长度M= 15,用线性探查法解决冲突构造这组关键码的散列表: n=11, M= 15 选P=13,则哈希函数为:h(key) = key%13,h(key) = key%13,(26,36,41,38,44,15,68,12,06,51,25),26: h(26) = 0 36: h(36) = 10 41: h(41) = 2 38: h(38) = 12 44: h(44) = 5 15: h(15) = 2h1(15) = 3 68: h(68) = 3h1(6

11、8) = 4,12: h(12) = 12h1(12) = 13 06: h(06) = 6 51: h(51) = 12h1(51) = 13h2(51) = 14 25: ?,(41),(15),(38),(38),(12),26,25,41,15,68,44,6,36,38,12,51,用线性探测法处理冲突,思路清晰,算法简单,但存在下列缺点: 1“二次聚集”现象。 2按上述算法建立起来的哈希表,删除工作非常困难。删除一个记录之后,不能简单地把该记录所在位置置为空。为了避免两个相同关键字值的记录同时装入表中,一种简单的处理方法是将被删记录所在位置上作删除标记。,b、二次深测法,探查序列依

12、次为:12,-12,22 ,-22,.,即探查函数是 d2i-1 = (d +i2) % M d2i = (d i2) % M,二次探查示例:,h(key) = key%11,用二次探测法处理冲突,也存在一定局限性:只有在哈希表长m为形如4j+3(j为整数)的素数时才能保证总能找到一个不发生冲突的地址。,(1)Fundamentals of Data StructureHorowite E,Sahni S (2)吉林大学,刘大有教授编写数据结构分析,解决冲突的主要方法 :(2) 链地址法 链地址法就是把具有相同散列地址的关键字的值存放在同一个链表中。在这种方法中,散列表中的每个单元不是存储相应

13、的元素,而是存储相应单链表的表头指针,单链表中的每个结点由动态分配产生,同时由于每个元素被存储在相应的单链表中,在单链表中可以任意的插入和删除结点。,解决冲突的主要方法 :(2) 链地址法 当向采用链地址法的散列表中插入一个关键字为Key的元素时,首先根据关键字Key计算出散列地址d,接着把由该元素生成的动态结点插入到下标为d的单链表的表头(可插入到单链表中的任何位置,但插入表头最方便)。查找过程也与插入类似,首先计算出散列地址d,然后从下标为d的单链表中顺序查找关键字为Key的元素,若查找成功则返回该元素的存储地址,若查找失败则插入该元素。,链地址法的优点:能较好地解决溢出问题。另外,该算法

14、中易于实现删除操作。缺点:除了哈希表需要的存储空间外,又增加了一个链域;另外,若哈希函数的均匀性较差时,会造成基本哈希表存储区中空闲单元较多。,解决冲突的主要方法 :(3) 再哈希法 Hi=RHi(key )(i=1,2,k)RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。,习题一:,使用哈希函数H(key)=key mod 11,把一个整数值转换成哈希表下标,现要把数据1,13,12,34,38,33,27,22插入到哈希表中。 (1)写出利用线性探测再散列法来处理冲突构造而得的哈希表; (2)写出利用链地址法处理冲突构造而得的哈希表; (3)在等

15、概率情况下,分别针对这两种情况求出查找成功的平均查找长度和查找不成功的平均查找长度。,习题二:,已知一组关键字为(26,36,41,38,44,15,68,12,6,51,25),用链地址法解决冲突。假设装填因子=0.75,哈希函数的形式为H(key)=key mod p(p为小于等于表长的最大素数),回答下列问题: (1)构造出哈希函数; (2)写出构造出的哈希表; (3)在等概率情况下,分别求出查找成功的平均查找长度和查找不成功的平均查找长度。,习题二答案:,由装填因子=0.75可得表长m=11/0.75=15 (1)在115中最大的素数是13,故取p=13,所以哈希函数为:H(key)=key mod 13(2)因为p=13,所以散列地址取0到12,用链地址法解决冲突,构造的哈希表为(下页图所示):(3)查找成功的平均查找长度为:ASLsucc=(1*7+2*2+3*1+4*1 )/11=18/11查找不成功的平均查找长度为:ASLunsucc=(1*6+2*5+3*1+5*1)/13=24/13,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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