在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))
重复的循环。如果m
和h_2(k)
之间没有公共因子,则它将以周期m
重复,这意味着你可以达到所有m
索引。所以你不想要共同因素。
通过使m
为2的幂,使h_2(k)
为奇数,可以很容易地满足"无公因子"规则。