数据结构—— 构造散列函数的六种方法【直接定址法-数字分析法-平方取中法-折叠法-除留余数法-随机数法】

目录:

一:直接定址法

二:数字分析法

三:平方取中法

四:折叠法

五:除留余数法

六:随机数法


这些方法原理都是将原来数字按某种规律变成另一个数字

一:直接定址法

关键字的某个线性函数值作为散列地址

直接定址法获取得到的散列函数有点就是简单,均匀也不会产生冲突

扫描二维码关注公众号,回复: 9338602 查看本文章

但问题是这需要事先知道关键字的分布情况

适合查找表较小且连续的情况

由于这样的限制,在现实应用中,此方法虽然简单,但却并不常用

二:数字分析法

如果关键字是位数较多的数字(比如手机号),且这些数字部分存在相同规律

则可以采用抽取剩余不同规律部分作为散列地址

比如手机号前三位是接入号,中间四位是 HLR 识别号,只有后四位才是真正的用户号

也就是说,如果手机号作为关键字,那么极有可能前 7 位是相同的

此时我们选择后四位作为散列地址就是不错的选择

同时,对于抽取出来的数字,还可以再进行反转

右环位移,左环位移等操作

目的就是为了提供一个能够尽量合理地将关键字分配到散列表的各个位置的散列函数


数字分析法通常适合处理关键字位数比较大的情况

如果事先知道关键字的分布且关键字的若干位分布较均匀,就可以考虑用这个方法

三:平方取中法

即取关键字平方的中间位数作为散列地址

比如假设关键字是 4321,那么它的平方就是 18671041,抽取中间的 3 位就可以是 671,也可以是 710,用做散列地址


平方取中法比较适合不知道关键字的分布,而位数又不是很大的情况

四:折叠法

折叠法是将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短些)

然后将这几部分叠加求和

并按散列表表长取后几位作为散列地址

比如假设关键字是 9876543210,散列表表长为三位

则我们可以将它分为四组 987|654|321|0

然后将它们叠加求和 987+654+321+0=1962

再取后 3 位得到散列地址即为 962

有时可能这还不能够保证分布均匀

那么也可以尝试从一端到另一端来回折叠后对齐相加

比如讲 987 和 321 反转

再与 654 和 0 相加,变成 789+654+123+0=1566

此时散列地址为 566


折叠法事先不需要知道关键字的分布适合关键字位数较多的情况

五:除留余数法

此方法为最常用的构造散列函数方法

对于散列表长的散列函数公式为

很显然,本方法的关键就在于选择合适的 

根据前辈们的经验

散列表表长

通常 小于或等于表长(最好接近)的最小质数不包含小于 20 质因子的合数

六:随机数法

选择一个随机数

取关键字随机函数值为它的散列地址

当关键字的长度不等采用这个方法构造散列函数是比较合适

发布了148 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/liu17234050/article/details/104270709