散列表和素數(shù)

理解自:鄧俊輝老師 《數(shù)據(jù)結(jié)構(gòu):散列》 -以蟬為師

我們假設(shè)有兩個散列hash_a和hash_b,表a的長度M = 7,表b的長度M = 8。假設(shè)我們從1的位置開始,步長為2的產(chǎn)生數(shù)據(jù)。
那么產(chǎn)生的數(shù)據(jù)即為1,3,5,7,9,11···
我們將他們映射到表a和表b中,假設(shè)數(shù)據(jù)就到1000

0 1 2 3 4 5 6
72 71 72 71 72 72 72

我們可以看到足跡是遍歷了整個表。
換到表2。

0 1 2 3 4 5 6 7
0 125 0 125 0 125 0 125

非常明顯的看到堆積問題。
這是為什么呢?原因非常簡單,因為當(dāng)任意步長為表長的因子時,總會出發(fā)回到原點(循環(huán)),導(dǎo)致堆積。
假設(shè)表長M和步長S有GCD(S,M) = k,k>1則必然(i + nS)%M =( i%M + nS%M)%M = (i + nk)%M(大概是吧,因為還沒學(xué)數(shù)論這里大概推導(dǎo)了一下)
解決的辦法就是讓GCD(S,M) = 1GCD表示最大公約數(shù),S為任意步長,M為表長。那么很明顯M必須為素數(shù)。
那么應(yīng)用到自然科學(xué)中,蟬的壽命在11和17這兩個素數(shù),假設(shè)蟬的天敵壽命為M,則蟬必然換代的年份平均分布在這個hash表(天敵的壽命)中。 如果為合數(shù),則容易發(fā)生蟬的數(shù)量的堆積,被天敵吃完。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容