哈希(双重哈希没有重新哈希)

时间:2011-11-16 06:05:00

标签: c++ hashtable probing double-hashing

这就是问题:

通过双重散列和主散列使用开放寻址 函数为hi(x) = (hash(x) + f(i)) mod M,其中hash(x) = x mod Mf(i) = i ∗ hash2(x)以及hash2(x) = 13 − (x mod 7)

我需要插入键27,22,16,26,47,12,42,3(按此顺序)。 该集合的大小为10

This is what i have so far:
0 []
1 []
2 [22]
3 []
4 []
5 []
6 [16]
7 [27]
8 []
9 []

我对插入26感到困惑,因为它是一个双重collsion ....任何人都可以解释如何做到这一点以及发生了什么?

2 个答案:

答案 0 :(得分:1)

冒着表现出我的无知的风险,我和M是如何定义的?我猜M等于大小,并且猜测我是一个插入数量的计数器,但这不会累加到你的输出。然而,我的实现不会在26但在42上发生冲突,这意味着它在发生冲突之前使用了超过一半的键空间。


但后来我意识到我喜欢这样会使位置依赖于插入顺序。

那时我已经回答但是惊慌失措并将其删除,在互联网上看起来并不傻,互联网永远不会忘记。但后来我开始想,也许我对哈希有错误的想法,也许这些数字不是单独的单位,而是作为一个整体散列的东西的一部分,然后顺序依赖是正确的。

有人可以改善我疯狂的猜测吗?


好的,让我们展开它。

hash(x) = x % M
hash2(x) = 13 - (x % 7)
f(i) = i * hash2(x)
hi(x) = (hash(x) + f(i)) % M

表示:i = 0,M = 10,x = 27

hash(x) = 27 % 10 -> 7
hash2(x) = 13 - (27 mod 7) -> 7
f(i) = 0 * 7 - > 0
hi(x) = (7 + 0) % 10 -> 7

表示:i = 1,M = 10,x = 22

hash(x) = 22 % 10 -> 2
hash2(x) = 13 - (22 mod 7) -> 12
f(i) = 1 * 12 - > 12
hi(x) = (12 + 12) % 10 -> 4

表示:i = 2,M = 10,x = 16

hash(x) = 16 % 10 -> 6
hash2(x) = 13 - (16 mod 7) -> 11
f(i) = 2 * 11 - > 22
hi(x) = (6 + 22) % 10 -> 8

依此类推,正如你所看到的那样,它与你所拥有的相差很快

答案 1 :(得分:1)

我怀疑r_ahlskog已经建议了什么。我们不应该只在发生碰撞时才增加。 由于26在碰撞中结束,我们应该增加i t0 1,此时26将被解析为插槽m = 4。

    M = 10 (no. of slots)   
    hi(x) = (hash(x) + f(i)) mod M   (6+0) mod 10 = 14 mod 10 = 6
                                    (6+8) mod 10 = 14 mod 10 = 4
    hash(x) = x mod M                      26 mod 10 = 6

    f(i) = i ∗ hash2(x)           (i=0)  0 * 8 = 0
                                          (i=1) 1 * 8 = 8

    hash2(x) = 13 − (x mod 7)             13 - (26 mod 7) = 13-5=8

hi(x)对于i = 0变为6,对于i = 1变为4。

如果我的理解错误,请纠正。

这是最终答案 -

[0]=12;
[1]=42;
[2]=22;
[3]=3;
[4]=26;
[5]=47;
[6]=16;
[7]=27;

第8和第9个插槽是免费的。

42也发生了碰撞。这在i = 3时已得到解决。