解析雜湊表中陣列的容量為什麼是質數

2021-06-28 09:09:32 字數 699 閱讀 5625

hash函式需要把原始資料均勻地分布到hash陣列裡,比如大部分是偶數,這時候如果hash陣列容量是偶數,容易使原始資料hash後不會均勻分布:

2 4 6 8 10 12這6個數,如果對 6 取餘 得到 2 4 0 2 4 0 只會得到3種hash值,衝突會很多。如果對 7 取餘 得到 2 4 6 1 3 5 得到6種hash值,沒有衝突。

同樣地,如果資料都是3的倍數,而hash陣列容量是3的倍數,hash後也容易有衝突,用乙個質數則會減少衝突的概率,更分散。

以下是求質數的**:

private

int getprime(int

min) }}

private

boolean isprime(int

num)

}return

true

; }

再雜湊法要求表的容量是乙個質數。為什麼會有這個限制,假設表的容量不是質數,表長是15(座標 0 - 14),有乙個特別關鍵字對映到0,步長為5,探測序列為0、5、10、0、5……,一直迴圈下去,演算法只會嘗試這三個單元,不可能找到其它空白單元,演算法崩潰。

如果陣列容量是13,即乙個質數,那麼探測序列會訪問到所有單元。即0、5、10、2、7、12、4、9、1、6、11、3,一直下去,只要表中有乙個空位,就可以探測到它。用質數作為陣列容量使得任何數想整除它是不可能的,因此探測序列最終會檢查到所有單元。

為什麼是雜湊表?!

為什麼是雜湊表?1 提出問題 這裡有乙個大的跨國公司,公司中的職員資訊全部儲存在資料庫中。對於其中的任何乙個職員來說,他們的唯一標識就是員工號,而這個公司的員工號是按照職員工作的地點以及部門及工作開始時間確定的,比如01 20 09 24 3,這乙個職工編號 純屬杜撰,但也有實際作用,因為在像群體查...

雜湊表的大小為什麼最好是素數

我也是總結了這篇帖子的主要內容。首先在說明為什麼雜湊表的大小最好為素數之前,先說一下若大小取2的整數冪的問題,對於x mod m這樣的函式,m即為雜湊表的大小,其中的好壞應該取決於x的生成法師和m的值。比如乙個字串 abc 如果把字串當成乙個128進製的整數,寫成 abc 128 128 65 12...

hashMap中容量為什麼是2的n次方(最簡單)

我們都知道hashmap進行hash雜湊的演算法是hash length 1 而hash的容量建議都是取2的n次方 首先我們先說說這個演算法,演算法的目的是為了得到小於length的更加均勻的數,如果不均勻容易產生hash碰撞,換句話說只有全是1,進行按位與才是最均勻的,因為1與上任何數都等於任何數...