hash表--常用hash函数取模法平方取中法折叠法,hash表长为质数或被取模的对象小于等于hash长度的质数原因

        在学习PHP数组底层实现原理的时候,发现就是通过hash表的方法实现。其实好多查询搜索的底层都是利用hash实现最快O(1)时间复杂度。hash的概念课本上,网上有甚多。其中,hash函数实现方法是让我最觉得好奇的。

        hash函数:直接寻址法,直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址,    实际生活中,关键字的元素很少是连续的。用该方法产生的哈希表会造成空间大量的浪费,因此这种方法适应性并不强

数字分析法、数字分析法是取数据元素关键字中某些取值较均匀的数字位作为哈希地址的方法。即当关键字的位数很多时,可以通过对关键字的各位进行分析,丢掉分布不均匀的位,作为哈希值它只适合于所有关键字值已知的情况。通过分析分布情况把关键字取值区间转化为一个较小的关键字取值区间。

平方取中法,

这是一种常用的哈希函数构造方法。这个方法是先取关键字的平方,然后根据可使用空间的大小,选取平方数是中间几位为哈希地址。

哈希函数 H(key)=“key2的中间几位”因为这种方法的原理是通过取平方扩大差别,平方值的中间几位和这个数的每一位都相关,则对不同的关键字得到的哈希函数值不易产生冲突,由此产生的哈希地址也较为均匀。

折叠法,所谓折叠法是将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位),这方法称为折叠法。

随机数法,

除留余数法取关键字被某个不大于散列表   表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取,素数,质数,或m,若p选的不好,容易产生同义词  摘自:哈希表

那么对p 的选择,关键字不仅可以通过直接对取模,还可以在上述数字分析,平方取中,折叠之后,在进行取模。这样使得关键字在通过hash函数映射到内存单元的任意地址是均匀的,减少冲突。

在取模的过程中对P为什么要使用质数或素数呢?

因为质数是只有1和他本身的因子。而合数除了1和他本身外还有其他因子。这样在取模的时候,就会出现相同的hash地址,进而增加冲突。  b = ak +n   n为取余之后的值,那么当a为合数的时候,同样是n,k的取值或b的取值是密集,增加冲突。可以参考博客:为什么求模运算要用素数(质数)—— 哈希表设计

关于hash函数的其他方法介绍,可以学习:哈希函数的构造方法

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值