目录:
这些方法原理都是将原来数字按某种规律变成另一个数字
一:直接定址法
取关键字的某个线性函数值作为散列地址:
直接定址法获取得到的散列函数有点就是简单,均匀也不会产生冲突
扫描二维码关注公众号,回复: 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 质因子的合数
六:随机数法
选择一个随机数
取关键字的随机函数值为它的散列地址:
当关键字的长度不等时采用这个方法构造散列函数是比较合适的