C++ 散列(不重新散列的双散列)

C++ 散列(不重新散列的双散列),c++,hashtable,probing,double-hashing,C++,Hashtable,Probing,Double Hashing,问题是: 通过双哈希和主哈希使用开放寻址 函数为hi(x)=(散列(x)+f(i))mod M,其中hash(x)=x mod M和f(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感到困惑

问题是:

通过双哈希和主哈希使用开放寻址 函数为
hi(x)=(散列(x)+f(i))mod M
,其中
hash(x)=x mod M
f(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感到困惑,因为这是一个双重对话……有人能解释一下怎么做以及发生了什么吗?

冒着显示我无知的风险,我和M是如何定义的?我猜M等于size,我猜I是插入次数的计数器,但这不等于您的输出。然而,我的实现在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

诸如此类,正如你所看到的,它很快偏离了你所拥有的

我对r_ahlskog提出的建议表示怀疑。我们不应该只在发生碰撞时才增加i吗。 由于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
对于i=0,hi(x)为6,对于i=1,hi(x)为4

如果我的理解错误,请更正

这是最后的答案--

插槽8和9是空闲的


碰撞也发生了42次。这个问题在i=3时得到了解决。

冒着显示我无知的风险,我和M是如何定义的?我猜M等于大小,我猜我是插入数的计数器,但这不等于你的输出。我不知道你在问什么。我问的是当数字发生碰撞时如何插入数字?这是我得到的答案,这是错误的我想象:26%10=6=13-(6%7)=7…然后7也发生碰撞。我一定是做错了什么的
[0]=12;
[1]=42;
[2]=22;
[3]=3;
[4]=26;
[5]=47;
[6]=16;
[7]=27;