为什么散列表的大小127(素数)优于128?

时间:2011-05-08 19:47:49

标签: algorithm hash primes

假设简单的统一散列,即,任何给定值同样地散列到散列的任何槽中。为什么使用大小为127而不是128的表更好?我真的不明白2号码的力量有什么问题。或者它实际上是如何产生任何差异的。

  

使用分割方法时,   我们通常会避开某些值   m(表格大小)。例如,m   不应该是2的幂,因为如果m   = 2 ^ p,则h(k)只是k的p个最低位。

假设可能的元素只在1到10000之间,我选择表格大小为128. 127如何才能更好? 所以128是2 ^ 6(1000000),127是0111111.这有什么区别?所有数字(当经过哈希处理时)仍然是127的p的最低位数。我弄错了吗?

我正在寻找一些例子,因为我真的不明白为什么这么糟糕。非常感谢提前!

PS:我知道: Hash table: why size should be prime?

9 个答案:

答案 0 :(得分:21)

  

所有数字(当经过哈希处理时)仍然是127的p的最低位数。

这是错误的(或者我误解了......)。 k % 127取决于k的所有位。 k % 128仅取决于7个最低位。


编辑:

如果您的分布在1到10,000之间。 10,000 % 12710,000 % 128两者都会将其转换为优秀的较小版本。所有桶都包含10,000/128 = 78(或79)个项目。

如果您的偏差分布在1到10,000之间,那么{x,2x,3x,..}的出现频率会更高。然后,如answer所述,素数大小将提供更好,更好的分布。 (除非x恰好是素数大小。)

因此,切断高位(使用128的大小)无论如何如果低位的分布足够好。但是,对于真实数据和真正设计糟糕的哈希函数,您将需要那些高位。

答案 1 :(得分:5)

分区方法

  

“当使用除法时,我们通常会避免m的某些值   (表格大小)。例如,m不应该是2的幂,因为如果m =   2p,然后h(k)只是p的{​​{1}}最低位。“

     

- CLRS

要了解为什么k仅使用m = 2p的{​​{1}}最低位,您必须先了解模数散列函数p

密钥可以用商k和余数h(k) = k % m来编写。

q

选择商为r,我们可以将k = nq + r 简单地写为上述等式中的余数:

q = m

因此,k % m相当于连续减去k % m = r = k - nm, where r < m 总共k % m次(直到m):

n

让我们尝试使用r < m哈希键k % m = k - m - m - ... - m, until r < m

k = 91

因此,m = 24 = 16只是 91 = 0101 1011 - 16 = 0001 0000 ---------------- 75 = 0100 1011 - 16 = 0001 0000 ---------------- 59 = 0011 1011 - 16 = 0001 0000 ---------------- 43 = 0010 1011 - 16 = 0001 0000 ---------------- 27 = 0001 1011 - 16 = 0001 0000 ---------------- 11 = 0000 1011 的二进制形式,只剩下91 % 24 = 11个最低位。


重要区别:

这特别适用于散列的划分方法。事实上,与CLRS中所述的乘法方法相反:

  

“乘法方法的一个优点是m的值并不重要......我们通常选择[m]为2的幂,因为我们可以在大多数计算机上轻松实现该功能。”

答案 2 :(得分:3)

首先,这不是选择一个素数。例如,如果您知道您的数据集将在1到10,000的范围内,那么选择127或128将不会产生任何影响bc这是一个糟糕的设计选择。

相反,最好为您的示例选择一个像3967这样的REALLY大质数,这样每个数据都有自己唯一的键/值对。您只想最小化碰撞。为你的例子选择127或128将没有什么区别bc所有127/128桶将被统一填充(这是坏的并且会降低插入和查找运行时间O(1)到O(n))而不是3967 (这将保留O(1)运行时间)

编辑#4

  

“哈希函数”的设计是   有点黑色的艺术。有可能   受到数据影响很大   意图存储在   基于哈希的数据结构,所以   讨论合理的哈希   功能往往会误入歧途   关于具体投入的讨论。

     

为什么素数是“首选”,人们有   考虑“对手”分析,   那是假设我设计了一个将军   基于哈希的数据结构,如何   如果输入最差,它会执行吗?   来自对手。表现以来   由哈希碰撞决定   问题变成什么是哈希   使用最小化碰撞的   最坏的情况。一个这样的条件是   当输入始终是数字时   可以被整数整除,比如说4.如果   你使用N = 128然后任何数字   可以被4 mod 128整除   可以被4整除,这意味着只有   水桶4,8,12,......永远都是   使用,导致25%的利用率   数据结构。有效的Primes   减少这种可能性   场景发生,数字&gt; Ñ

答案 3 :(得分:3)

尼克是对的,一般来说,哈希表的大小并不重要。但是,在使用打开寻址并使用双重哈希的特殊情况下(其中探测之间的间隔由另一个哈希函数计算)则使用素数大小的哈希表最好确保所有哈希表条目都可用于新元素(如Corkscreewe所述。)

答案 4 :(得分:2)

如果你有一个具有均匀分布的完美哈希函数,那么无关紧要。

答案 5 :(得分:2)

维基百科实际上对此有一个很好的总结:

http://en.wikipedia.org/wiki/Hash_table

他们指出一些哈希函数只能用素数运算。这篇文章解释了为什么两个人的权力都很糟糕:

http://www.concentric.net/~Ttwang/tech/primehash.htm

答案 6 :(得分:0)

我不能再证明这一点,虽然我记得在一百万年前的大学考试中必须这样做,但最佳哈希大小不仅仅是素数。您想要选择素数 N ,以便N = 4*M − 1(其中 M 也是整数)。

这使得31个桶的数量比29好。当 N 为31时, M 为8,但是当没有积分 M N 是29。

正如我所说,我不再记得数学来证明这一点。大约25年前,这是在Udi的妻子Rachel Manber教授的理论课程中。

答案 7 :(得分:0)

  

我认为这只与计算机工作的事实有关   与基数2相似。基数为10的情况类似。

     

...

     

选择一个足够大,非幂二的数字将确保散列函数确实是所有输入位的函数,而不是   它们的一部分。

来自Why hash tables should use a prime-number size

答案 8 :(得分:0)

这是一种了解&#34; k%127取决于k的所有位。 k%128仅取决于7个最低位。&#34; 。
k%128等于k&amp; (2 ^ 7-1)。例如:129%128 = 1,In Binary:1000 0001&amp; 0111 1111 = 0000 0001,(2 ^ 7-1)的任何高位都为0,这意味着高位是无关紧要的。但是这个翻译对于不等于2 ^ n的数字是无效的 现在让我们来看看我们如何在Decimal 129%127中进行划分,首先看看最高位置1,小于127,然后我们得到下一个项目2结合拳头我们得到12,12小于127,然后结合9表示129,除以127,余数为2,我们可以用数学写出:129 = 1 * 127 + 2,所以我们得到2 [所有这一切称为Long_division],在二进制除法中它是一样的,现在,我们知道k%127取决于k的所有位