双散列在开放寻址中,散列函数和表的长度是多少



在Cormen的《算法导论》一书中,我读到双重哈希(在开放寻址中)函数的形式是:

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

其中k是一个键,i在冲突的情况下是下一个索引,m为表长度,1hX则为哈希函数。

他说,双重散列的主要问题是利用表中的所有索引。为了解决这个问题,我们应该将m设置为2的幂,并且h2函数应该返回奇数。为什么(我看不出他在解释)?

一般规则是,以m为模,重复加上h_2(k)是一个与周期m/GCD(m, h_2(k))重复的循环。如果mh_2(k)之间没有公共因子,则它将以周期m重复,这意味着你可以达到所有m索引。所以你不想要共同因素。

通过使m为2的幂,使h_2(k)为奇数,可以很容易地满足"无公因子"规则。

最新更新