首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列(双重散列而不重新散列)

散列(双重散列而不重新散列)
EN

Stack Overflow用户
提问于 2011-11-16 14:05:00
回答 2查看 1.1K关注 0票数 1

这是一个问题:

使用双重散列的开放寻址,主散列函数是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

代码语言:javascript
复制
This is what i have so far:
0 []
1 []
2 [22]
3 []
4 []
5 []
6 [16]
7 [27]
8 []
9 []

我对插入26感到困惑,因为它是一个双collsion....Can,有人能解释一下怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-16 17:11:03

冒着显示我的无知的风险,我和M是如何定义的?我会猜测M等于size,并且会猜测i是插入次数的计数器,但这不会加到您的输出中。然而,我的实现不会在26上发生冲突,而是在42上发生冲突,这意味着在发生冲突之前,它使用了超过一半的密钥空间。

但后来我意识到,指定我喜欢的位置将使位置依赖于插入顺序。

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

有人能改进我的胡乱猜测吗?

好的,那么让我们展开这个。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
hash(x) = 16 % 10 -> 6
hash2(x) = 13 - (16 mod 7) -> 11
f(i) = 2 * 11 - > 22
hi(x) = (6 + 22) % 10 -> 8

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-19 12:46:19

我对r_ahlskog的建议持怀疑态度。我们不是应该只在发生碰撞时才递增i吗?由于26以冲突结束,我们应该递增i t0 1,此时26被解析为槽m=4。

代码语言:javascript
复制
    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。

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

这是最终的答案--

代码语言:javascript
复制
[0]=12;
[1]=42;
[2]=22;
[3]=3;
[4]=26;
[5]=47;
[6]=16;
[7]=27;

插槽8和9是空闲的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8147426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档