如果在双哈希中与主哈希函数发生冲突,则使用辅助哈希函数。 但是如果你也与它发生了碰撞,那么你必须重新进行,然后将表大小加倍并选择最接近的素数作为新的表大小。 这会改变你的主哈希函数吗?例如,如果你的主哈希函数是关键mod tableSize而你的tableSize最初是11,现在它是23,那么它也会改变吗?因为如果散列函数保持不变,您仍然会在相同的位置发生碰撞。
答案 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。我也遇到了这种困境。当我问我的教授时,他说在重新散列时没有必要改变主哈希函数。即使你在技术上仍然在同一个地方发生碰撞,你仍然可以在使用开放寻址技术重新发现时找到一个空位。但是,他说通常主哈希函数将更改为新的模数,其中一个原因是它有助于防止数据聚类。总而言之,从他所说的不对或错的角度来看,但改变散列函数是更好的途径,以避免在同一个地方发生聚类和碰撞。希望这有帮助!