构造乘法散列表的乘法方法包含了两个步骤:
1. 用关键字 K 乘上常数 A (0<A<1),并抽取出 kA 的小数部分
2. 然后再用 m 乘以这个值,再向下去整
总之散列函数为:
h(k) = |_ (m*(k*Amod1)) _|
这里对m没有太大的要求,一般选择他为2的某个幂次方( m 的取值规定了hash的长度)
Knuth提出 A 的最佳选择为 A ≈ (√5-1)/2 = 0.618 033 988 7....
这里引出了我对这个 A 的值的思考。于是我写了程序来对 A 的选择做了测试。
首先我以 A={0, 0.01, 0.02 ...... 0.98, 0.99} 这些数字做了测试,并且m的取值为1000。
从而得出以下的结果:
Case 1000:
a:0.010000 num:0
a:0.020000 num:49
a:0.030000 num:0
a:0.040000 num:74
a:0.050000 num:79
a:0.060000 num:50
a:0.070000 num:0
a:0.080000 num:74
a:0.090000 num:0
a:0.100000 num:89
a:0.110000 num:0
a:0.120000 num:74
a:0.130000 num:0
a:0.140000 num:49
a:0.150000 num:79
a:0.160000 num:74
a:0.170000 num:0
a:0.180000 num:50
a:0.190000 num:0
a:0.200000 num:95
a:0.210000 num:0
a:0.220000 num:50
a:0.230000 num:0