【发布时间】:2014-11-07 22:15:04
【问题描述】:
我正在阅读有关双重哈希以及如何将其与哈希表的开放寻址方案一起使用的信息。我理解开放寻址中的散列函数 h(k) 需要为给定键 k 生成探测序列的要求,使得探测序列是集合 的某种排列对于 m 个桶。线性探测通过使用函数增加探测计数来简单地做到这一点
h(k,i) = (h1(k) + i) mod m
双重哈希使用函数
h(k,i) = (h1(k) + i*h2(k)) mod m
以便探测以 i*h2(k) 的增量进行。
双重散列的建议是选择“m”作为 2 的幂,并始终从 h2(k) 返回一个奇数,以便这两个数互质。这如何保证探针序列是集合 的置换?
【问题讨论】:
-
在Computer Science 上获得答案可能会更好。
-
或 mathoverflow.net。但这里是快速的:m 是 2 的幂,k 是奇数,h、i 和 j 是整数,其中 j > i。假设
h + i*k ==(mod m) h + j*k。从两边减去左边,我们得到0 ==(mod m) (j-i)*k,这相当于说(j-i)*k = c*m对于一些c。由于k是奇数且m是2 的幂,所以gcd(k,m) == 1,所以如果(j-i)*k = c*m,那么m必须是j-i的因子,这意味着@987654333 @ 至少是m。 QED。
标签: algorithm data-structures hash double-hashing