在双重哈希中重组还会改变主哈希函数吗?

时间:2013-11-18 09:12:18

标签: java algorithm hashtable double-hashing

如果在双哈希中与主哈希函数发生冲突,则使用辅助哈希函数。 但是如果你也与它发生了碰撞,那么你必须重新进行,然后将表大小加倍并选择最接近的素数作为新的表大小。 这会改变你的主哈希函数吗?例如,如果你的主哈希函数是关键mod tableSize而你的tableSize最初是11,现在它是23,那么它也会改变吗?因为如果散列函数保持不变,您仍然会在相同的位置发生碰撞。

3 个答案:

答案 0 :(得分:1)

  

当您与double中的主哈希函数发生冲突时   散列,您使用辅助散列函数。但如果你有一个   与那个碰撞,然后你必须重新进行,所以你加倍   表格大小并选择最接近的素数作为新表格   大小

我不认为这是真的。

在双重哈希中,

 h(k,i) = h1(k) + i*h2(k)

其中h(k,i)是为密钥探测的第(i + 1)个时隙。所以你连续增加了i,所以你打了一个空位。

当加载因子超过特定值时,你需要重新散列,并且当重新散列时,一般主要散列函数会改变,但是我认为你可以在没有它的情况下改变它([编辑:更改主散列函数]),虽然它会降低性能。

答案 1 :(得分:0)

实际上,对于双重散列,我使用表大小2 ^ N和两个散列函数,计算值h1(位置)和h2(步骤)。步骤必须是奇数,符合条件

gcd(table_sz, step) == 1

当此条件符合时,试用索引会迭代表中的所有单元格。

此后,我只使用索引(pos),(pos + step),(pos + step + step)迭代表,并且 所以,模数为table_size。

程序的主循环似乎是:

do {
  pos = (pos + step) & (TAB_SIZE - 1);
} while(table[pos] have collision);

请参阅此处的简单实施示例:

http://olegh.cc.st/src/words.c.txt

有趣的实现,当你有TAB_SIZE = 2 ^ 16时。在这种情况下,您可以将变量(pos,step)定义为unsigned short,并且不需要应用mask(TAB_SIZE - 1); 相反,你只需写:

pos += step;

答案 2 :(得分:0)

几周前,在我的数据结构类中,我们正在研究Hash Tables。我也遇到了这种困境。当我问我的教授时,他说在重新散列时没有必要改变主哈希函数。即使你在技术上仍然在同一个地方发生碰撞,你仍然可以在使用开放寻址技术重新发现时找到一个空位。但是,他说通常主哈希函数将更改为新的模数,其中一个原因是它有助于防止数据聚类。总而言之,从他所说的不对或错的角度来看,但改变散列函数是更好的途径,以避免在同一个地方发生聚类和碰撞。希望这有帮助!