1. 程式人生 > >從平方探測法引申——平方數列取模的規律數列

從平方探測法引申——平方數列取模的規律數列

  • 今天跟人複習了散列表中的平方探測法,發現一個十分有趣的事實
自然數列 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]
所以
n2r2(modk)

對於一個k的週期來說

(k為偶數。k為奇數時只是多處理一個數字,原理是一樣的)

Mod k 1 2 3 4 …… k/2 k/2+1 k/2+2 …… k-1 0

我們有
k2+1k2+1(modk)
k2+2(k22)(modk)
k2+3(k23)(modk)
……
k11(modk)
k0(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這樣變化的。
又有

{n2r2(modk)r2=r2

自然就會看到這是個對稱的變化了。

那麼,形如
{an|an=nλ,λN+}
這樣的數列呢?
容易得到當λ 是偶數的時候,還是有這樣的性質。
當λ 是奇數的時候
rλ=(r)λ
此時就不是對稱的了。

對於平方探測法 F(i)=i2來說
i>k2 的時候,必定在前面有i0 使得 Hash(x)+i20Hash(x)+i2(modk)
這就產生了衝突,這個衝突是必定存在的。

於是,Hash的可選空位必定小於等於k/2.