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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/maoliran/article/details/52082829

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

展开阅读全文

没有更多推荐了,返回首页