为什么这个哈希表查找探测器会像它一样?

时间:2014-06-18 21:19:24

标签: algorithm hash probing

此代码(来自未知来源的LZW压缩程序)在大小为5021的哈希表中找到一个空槽,索引范围为0到5020:

probe := <random 12-bit hash key>
// probe is initially 0 to 4095
repeat
  {
  if table[probe] is empty then return(probe);
  if probe == 0 then probe := -1 else dec(probe, 5021-probe);
  if probe < 0 then inc(probe, 5021);
  }

这不是典型的线性或二次探测。为什么这样探测?这是一种已知的探测算法,我在哪里可以找到更多关于它的信息?

1 个答案:

答案 0 :(得分:0)

计算新探针的算法虽然外观丑陋但很简单:

if probe == 0
    probe <= 5020
else
    probe <= (2*probe) % 5021

为什么选择这个函数还不是很清楚,但它确实以循环和看似随机的方式经历了所有可能的位置1..5020(并且0被发送回循环)。 (不,它没有,请看哎呀!)应该注意的是,在这种情况下,数字5021有点神奇。

该算法实际上是线性同余生成器(LCG)。见http://en.wikipedia.org/wiki/Linear_congruential_generator

OOPS:这是一个LCG,但不是具有最佳时期的LCG,因为2 ^ 1004%5021 == 1.有以下成员有五个不同的周期:(1,2, 4,8,...),(3,6,12,24,...),(7,14,28,56,...),(9,18,36,72 ......) ,和(11,22,44,88,......)。更奇怪的是有人选择使用这种算法。 (或者我分析错了。)