哈希表的大小为什么最好是素数

在看数据结构和算法分析这本书的时候,哈希表建议大小为素数,但里面并没有详细说明为什么,只说了因为它在哈希表最小化集群,这又是为什么,我通过百度,外加自己的理解说明一下为什么哈希表的大小最好为素数,感觉并没有很大的答案,只能说略作总结。这里贴上一篇比较好的帖子https://segmentfault.com/q/1010000000593741

我也是总结了这篇帖子的主要内容。

首先在说明为什么哈希表的大小最好为素数之前,先说一下若大小取2的整数幂的问题,对于x mod M这样的函数,M即为哈希表的大小,其中的好坏应该取决于x的生成法师和M的值。比如一个字符串“ABC”,如果把字符串当成一个128进制的整数,写成“ABC” = 128 * 128 * 65 + 128 * 66 + 67,这种形式中,若M = 128,那么只要根据最后一个字符是否相同就可以判断是否会冲突,也就是说结果取决于最后一个字符,便会造成不均匀。

对于哈希表最好为素数这个问题也是有争议的。这里也只能说按照x mod M这种最普遍的哈希函数来解释,如果想让哈希做好冲突小,效率高的效果,还是要从哈希函数来分离数据的特征的。

恰好等于或接近2的整数幂都只是暴露原值。素数才能用来避免冲突,如果种子用合数,那么很可能对合数的某个因数取余,所得到的余数仍然是一样的。帖子中举例说:对4取余如果余1,那么对2取余仍然余1.开始觉得还挺对的,后来想想对4取余跟对2取余啥关系,当哈希表大小为4时,谁会再对2取余呢?

自我感觉如果还是x mod M这种哈希函数,想要让冲突小,那就只有让哈希表的大小越大越好,冲突自然就小了,至于素数的问题发现还是无果。如果有朋友对这方面有高见,还请跟我交流(邮箱wgymaoliran@sina.com)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值