使用分区方法进行哈希 - 选择槽数?

时间:2018-01-31 05:05:10

标签: algorithm data-structures hash probability

所以,在CLRS中,有这个引用

  

一个不太接近2的精确幂的素数通常是m的一个好选择。

几个问题......

  1. 我理解2的幂是如何只是你的密钥的低阶位......但是,假设你有一个1到1百万的密钥,每个密钥具有相同的概率宇宙(如果不给出其他数据,我猜测是你宇宙的常见假设吗?)那么就不会说4个低阶位导致(2 ^ 4)低阶位模式很漂亮从1到100万的钥匙几乎同样可能?我怎么想错了?
  2. 为什么是素数?因此,如果2的幂不是一个好主意,为什么素数是一个更好的选择,而不是接近2的幂的复合数(为什么它应该接近2的幂) ...笑)?

1 个答案:

答案 0 :(得分:0)

您正在尝试找到一个适用于典型输入数据的哈希表,而典型的输入数据会执行您不会从良好的随机数生成器中获得的内容。通常你会得到格式化或半格式化的字符串,当转换为数字时,最终为K,K + A,K + 2A,K + 3A,....对于某些整数K和A.如果K + xA和K + yA哈希到相同的数字mod m,然后(xy)A必须是0 mod m。如果m是素数,这只能在A = 0 mod m或x = y mod m时发生,因此一次以m为单位。但是如果m = pq并且A碰巧可以被p整除,则每当x-y被q整除时就会发生碰撞,这通常是因为q<米。

我估计接近2的幂,因为内存管理系统可能很容易拥有最终大小的内存块 - 我真的不知道。如果你真的在乎,如果你有时间,你可以尝试不同的素数和一些有代表性的数据,看看哪些是实践中最好的。