- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈希函数的构造方法 实际造表时,采用何种构造哈希函数的方法取决于建表的关键字集合的情况(包括关键字的范围和形态),总的原则是使产生冲突的可能性降到尽可能地小。 实际造表时,考虑的因素: 计算哈希函数所需时间; 关键字的长度; 哈希表的大小; 关键字的分布情况; 记录的查找频率 处理冲突的方法 假设哈希表的地址集为0~(n-1),冲突是指由关键字得到的哈希地址为j(0≤j≤n-1)的位置上已存在记录,则处理冲突就是为该关键字的记录找到另一个“空”的哈希地址。 处理冲突的实际含义是:为产生冲突的地址寻找下一个哈希地址。 在处理冲突的过程中可能得到一个地址序列Hi(i=1,2,…,k,Hi∈[0,…,n-1])。即在处理哈希地址的冲突时,若得到的另外一个哈希地址Hi任然发生冲突,则再求下一个地址H2,若H2任然冲突,再求得H3。依次类推,直至Hk不发生冲突为止,则Hk为记录在表中的地址。 解决冲突的方法又称为溢出处理技术。因为任一种散列函数不能避免产生冲突,因此选择好的解决冲突溢出方法十分重要 处理冲突的方法 1.?开放定址法 为产生冲突的地址H(key)求得一个地址序列: H0, H1, H2, …, Hs 1≤s≤m-1 其中:H0 = H(key) Hi = ( H(key) + di ) MOD m i=1, 2, …,s 增量 di 有三种取法: (1)?线性探测再散列:di = c?i。c为步长,最简单的情况 c=1 (2)?平方探测再散列:di = 12, -12, 22, -22, …, (3)?随机探测再散列:di 是一组伪随机数列 处理冲突的方法 1.?开放定址法 注意:增量di应具有“完备性”。即产生的Hi均不相同,且所产生的s(m-1)个Hi值能覆盖哈希表中所有的地址。则要求: 平方探测时的表长m必为4j+3的质数; 随机探测时的m和di没有公因子。 线性探测容易产生二次聚集,一次聚集的产生主要取决于哈希函数,在哈希函数均匀的前提下,可以认为没有一次聚集。 处理冲突的方法 1.?开放定址法 线性探测: 假定采用的H函数为:H(key)= keyMOD11,关键字序列为:17、60、29、38 … 处理冲突的方法 1.?开放定址法 当散列 38 时发生冲突,同 60 争夺第 5 个单元 解决办法 :探测下一个空单元,步长:1 H(key) = ( key+di) MOD 11,其中:di 为 1、2……10 注意:可取其它步长,如 3 冲突: 初级冲突:不同关键字值的结点得到同一个散列地址。 二次聚集:同不同散列地址的结点争夺同一个单元。 结果:冲突加剧,最坏时可能达到 O(n)级代价。 处理冲突的方法 1.?开放定址法 解决办法: 改变步长:选和 m 互质的数作为步长,如 3、5、7…… 如选步长为 5,用 H(key) = ( key+5) MOD 11 H(key) = ( key+ 5×2) MOD 11 H(key) = ( key+ 5×3) MOD 11 等进行下一个空的单元,直到找到为止。 随机地改变步长,如取步长序列:2,7,4,3,6,1,5,如用 H(key) = ( key+2) MOD 11 H(key) = ( key+7) MOD 11 H(key) = ( key+ 4) MOD 11 等进行探测下一个空的单元,直到找到为止。 处理冲突的方法 1.?开放定址法 例:假设哈希表长度m=13,采用除留余数法哈希函数建立如下关键字集合的哈希表: {16,74,60,43,54,90,46,31,29,88,77}。 处理冲突的方法 1.?开放定址法 对构造的哈希表采用线性探查法解决冲突。 解: h(16)=3,h(74)=9,h(60)=8,h(43)=4, h(54)=2,h(90)=12,h(46)=7,h(31)=5, h(29)=3 冲突 d0=3,d1=(3+1) mod 13=4 仍冲突 d2=(4+1) mod 13=5 仍冲突
文档评论(0)