为什么二次探查法选用的模数最好是4k+3的质数?
为什么二次探查法选用的模数最好是是4k+3的质数?
二次探查法
Quadratic probing can be a more efficient algorithm in an open addressing table, since it better avoids the clustering problem that can occur with linear probing, although it is not immune. It also provides good memory caching because it preserves some locality of reference; however, linear probing has greater locality and, thus, better cache performance.
——form Wikipedia
为了解决哈希表中的哈希冲突问题,人们想出了许多方法。其中二次探测是开放寻址表(open addressing table)中非常有效的算法,因为它可以在一定程度上减少线性探测可能出现的聚集问题(clustering problem)产生的影响。
在二次探查法中,哈希函数通常采用以下形式:
其中,\(H(k, i)\)是哈希函数的结果,\(h(k)\) 是关键字 \(k\) 的散列值,\(i\) 是探查步数,\(c1\) 和 \(c2\) 是常数,\(m\) 是哈希表的大小(模数)。
二次探查法的问题
当\(c1 = 0, c2 = 1\)时,若出现周期性重复:
如果m是质数,由于\(i \neq j\),\(|i-j| < m\),则\((i-j)\nmid m\),故:
很显然,在\(i=\lfloor m/2 \rfloor, j = \lceil m/2 \rceil\),时就会发生周期性重复。
而如果m不是质数,周期性重复只会来得更早。
这样只有\(\lfloor m/2 \rfloor\)的空间被利用,显然是不可接受的。
双向二次探查法
双向二次探查法则能很好地解决这个问题。双向二次探测法的地址增量序列为 \(d_i = 1^2, -1^2, 2^2, -2^2,… , q^2, -q^2\)。可以证明,当m是4k+3的质数,双向二次探查法的搜索链前m项互异。
若\(x + i^2 ≡ x + j^2 (mod{\quad}m)\),与上文类似,当\(i=\lfloor m/2 \rfloor, j = \lceil m/2 \rceil\),会第一次发生周期性重复。但由于增量是正负交替的,所以搜索链已有\(2*\lfloor m/2 \rfloor + 1 = m\)项;
若\(x - i^2 ≡ x - j^2 (mod{\quad}m)\),与上文类似,当\(i=\lfloor m/2 \rfloor, j = \lceil m/2 \rceil\),会第一次发生周期性重复。但由于增量是正负交替的,所以搜索链已有\(m+1\)项;
若\(x - i^2 ≡ x + j^2 (mod{\quad}m)\)或\(x + i^2 ≡ x - j^2 (mod{\quad}m)\),即\(i^2+j^2 ≡ 0 (mod{\quad}m)\)。但根据费马平方和定理,奇质数能表示为两个平方数之和的充分必要条件是该质数被4除余1。所以若\(m为=4k+3\)形式,这种情况根本不存在!而若\(i^2+j^2 = nm, n>1\)则在这之前就已经发生上面两种情况了。
综上所述,得证。

浙公网安备 33010602011771号