- 今天跟人复习了散列表中的平方探测法,发现一个十分有趣的事实
自然数列 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | …… |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
平方数列 | 1 | 4 | 9 | 16 | 25 | 36 | 49 | 64 | 81 | 100 | 121 | 144 | 169 | 196 | 255 | 265 | 289 | …… |
mod 6 | 1 | 4 | 3 | 4 | 1 | 0 | 1 | 4 | 3 | 4 | 1 | 0 | 1 | 4 | 3 | 4 | 1 | …… |
mod 7 | 1 | 4 | 2 | 2 | 4 | 1 | 0 | 1 | 4 | 2 | 2 | 4 | 1 | 0 | 1 | 4 | 2 | …… |
mod 17 | 1 | 4 | 9 | 16 | 8 | 2 | 15 | 13 | 13 | 15 | 2 | 8 | 16 | 9 | 4 | 1 | 0 | …… |
可以发现 对6取余,是一个循环数列,循环节是143410.
并且除掉0之后,这串子数列是对称的
这个结论对于7和17也是成立的
那么 是不是对于任意的正整数k>2,都是成立的呢?
对于任意的自然数n来说,总可以表示成n=a*k±r,其中a是商,r是余数
所以
n2=(ak±r)2=a2k2±2ark+r2r∈[0,k2]
所以
n2≡r2(modk)
对于一个k的周期来说
(k为偶数。k为奇数时只是多处理一个数字,原理是一样的)
Mod k | 1 | 2 | 3 | 4 | …… | k/2 | k/2+1 | k/2+2 | …… | k-1 | 0 |
---|
我们有
k2+1≡−k2+1(modk)
k2+2≡−(k2−2)(modk)
k2+3≡−(k2−3)(modk)
……
k−1≡−1(modk)
k≡0(modk)
Mod k | 1 | 2 | 3 | 4 | …… | k/2 | -k/2+1 | -k/2+2 | …… | k-1 | 0 |
---|
可以看到 余数是从1,2……,k/2,-k/2+1……-2,-1,0这样变化的。
又有
自然就会看到这是个对称的变化了。
那么,形如
{an|an=nλ,λ∈N+}
这样的数列呢?
容易得到当λ 是偶数的时候,还是有这样的性质。
当λ 是奇数的时候
−rλ=(−r)λ
此时就不是对称的了。
对于平方探测法
F(i)=i2
来说
当
i>k2
的时候,必定在前面有
i0
使得
Hash(x)+i20≡Hash(x)+i2(modk)
这就产生了冲突,这个冲突是必定存在的。
于是,Hash的可选空位必定小于等于k/2.