假设简单的统一散列,即,任何给定值同样地散列到散列的任何槽中。为什么使用大小为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?答案 0 :(得分:21)
所有数字(当经过哈希处理时)仍然是127的p的最低位数。
这是错误的(或者我误解了......)。 k % 127
取决于k的所有位。 k % 128
仅取决于7个最低位。
编辑:
如果您的分布在1到10,000之间。 10,000 % 127
和10,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)
答案 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的情况类似。
...
选择一个足够大,非幂二的数字将确保散列函数确实是所有输入位的函数,而不是 它们的一部分。
答案 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的所有位