当线性探测始终找到一个时,二次探测如何在下次插入时找不到位置?

时间:2015-03-15 04:31:08

标签: java algorithm hash quadratic-probing linear-probing

我正在从Data Structures Practice

做一个练习题

问题
1.线性探测将(第一圈):
随着更多值的插入,i。逐渐降低性能 ii。可能在下次插入时找不到位置
iii。以上任何一项

2.Quadratic Probing will(circle one):
随着更多值的插入,i。逐渐降低性能 ii。可能在下次插入时找不到位置
iii。以上任何一项

根据回答键(来自链接),1的答案是i,2的答案是ii。

我同意答案问题1.线性探测将探索所有可能性并在需要时包装到哈希表的开头。因此,它会在下一次插入时找到一个位置。如果插入映射到同一个存储桶或一个存储桶附近的一堆值,则会产生群集并且性能会降低。
我理解为什么问题2的答案不是我。二次增量以不同的增量进行探测以避免聚类问题。然而,有些人可以解释二次探测“在下一次插入时可能找不到位置”背后的直觉 二次探测函数定义为(来自 Quadratic Probing
n探针为((h(k)+ n 2 )mod TableSize)直到探针达到零(未占用)

根据我在其他问题 Quadratic Probing中学到的内容,二次探测有可能击中每个桶。与线性探针一样,如果需要,二次探针也应该包装在哈希表的开头。为什么然后在这个问题中,二次探针在线性探针可以在下次插入时找不到位置?

3 个答案:

答案 0 :(得分:2)

要确定h(k)+ n ^ 2是否搜索了所有可能性,你需要找出n ^ 2是否占用所有可能的值来修改哈希表大小 - 比如N.所以你需要知道是否通过选择所有n的n种可能性n ^ 2可以占用所有N个不同的值。

( - n)^ 2 = n ^ 2所以这里是方形函数的不同输入值,它们产生相同的输出值。因此不可能产生所有N个不同的输出值,因为不同输入值的结果之间存在冲突。

示例 - 工作模7. 7. ^ 2 = 6 ^ 2 = 1. 2 ^ 2 = 5 ^ 2 = 4. 3 ^ 2 = 4 ^ 2 = 2. 7 ^ 2 = 0.所以如果你平方输入(0,1,2,3,4,5,6)得到输出(0,1,4,2,2,4,1),你不能产生3,5或6 - 事实上这个例子足以表明你不能保证搜索所有可能的插槽,但上面的数学比我的算术更可靠,并且显示这里的行为非常普遍。

答案 1 :(得分:1)

某处必须有证据证明这一点。但是,在大多数情况下,我都不知道二次探测是如何击中每个铲斗的。

假设表大小为7,h(k)为0.对于第i次迭代,probe = i ^ 2 mod 7.我测试的所有i小于10,000且总是求值为0,对于任何i,1,2或4。铲斗3,5和6永远不会被探测。

这是我使用的脚本:



var hash_of_k = 0;
var table_size = 7;
var iteration_limit = 10000;
var buckets =  new Object();

//Probe buckets
for(var i=0; i<iteration_limit; i++){
  b = (hash_of_k+(i*i)) % table_size;
  buckets[b] = 1;
}

//Report which buckets were probed.
var buckets_probed = '';
for(b in buckets){
  buckets_probed += b + '  ';
}

alert(buckets_probed);
&#13;
&#13;
&#13;

您可以将迭代限制设置得更高,但这似乎并不实用。似乎二次探测的重点是找到一个比线性探测更快的空桶。

答案 2 :(得分:1)

我认为问题是在什么情况下,如果发生碰撞,二次探测将无法找到下一个位置。

通过下面的例子,我确实看到二次探测在相同结果密钥发生碰撞的情况下无法找到位置。

假设哈希表大小为7。

以下是要插入的数字23,39,9,16,30。

h(k,i)= [h(k)+ sqr(i)] mod 7其中h(k)= k mod 7.

for i = 0, h(k,0) = h(k)
for i = 1, h(k,1) = [h(k) + 1] mod 7
for i = 2, h(k,2) = [h(k) + 4] mod 7
for i = 3, h(k,3) = [h(k) + 9] mod 7

23 --> 23 % 7 = 2

39 --> 39 % 7 = 4

9  --> 9 % 7 = 2 <--- Collision
   2 + 1 = 3

16 --> 16 % 7 = 2 <--- Collision
   2 + 1 = 3 <--- Collision
   2 + 4 = 6

30 --> 30 % 7 = 2 <--- Collision

   2 + 1 = 3 <--- Collision

   2 + 4 = 6 <--- Collision
   2 + 9 = 4 <--- Collision
   2 + 16 = 4 <--- Collision
   2 + 25 = 6 <--- Collision
   2 + 36 = 3 <--- Collision
   2 + 49 = 2 <--- Collision
   2 + 64 = 3 <--- Collision
   2 + 81 = 6 <--- Collision
   2 + 100 = 4 <--- Collision
   2 + 121 = 4 <--- Collision
   2 + 144 = 6 <--- Collision
   2 + 169 = 3 <--- Collision
   2 + 196 = 2 <--- Collision
   2 + 225 = 3 <--- Collision
   2 + 256 = 6 <--- Collision
   2 + 289 = 4 <--- Collision
   2 + 324 = 4 <--- Collision
   2 + 361 = 6 <--- Collision
   2 + 400 = 3 <--- Collision

任何关键k(k mod size)等于2(如37,44,51,58等)就是这种情况

相关问题