哈希衝突解決

哈希函數作爲hashmap、hahstable的底層實現,會出現哈希衝突的情況,針對衝突,常用的解決方法有:

1. 開放定址法

開放定址法就是一旦發生衝突,就去尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總能找到,並將記錄存入。

Hi = (H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)爲散列函數,m爲散列表長,di爲增量序列。di可有下列三種取法:

(1)di=1,2,3,…, m-1,稱爲線性探測再散列;

(2)di=1^2, -(1^2), 2^2, -(2^2), 3^2, …, ±(k^2),(k<=m/2),稱二爲次探測再散列;

(3)di=僞隨機數序列,稱爲僞隨機探測再散列。

所謂僞隨機數,用同樣的隨機種子,將得到相同的數列。

2. 再散列函數法

Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函數(比如除留餘數、摺疊、平方取中),在同義詞產生地址衝突時就換用另一個散列函數計算散列地址,直到碰撞不再發生,這種方法不易產生“聚集”,但增加了計算時間。

3. 鏈地址法

將所有關鍵字爲同義詞的記錄存儲在一個單鏈表中,稱這種表爲同義詞子表,在散列表中只存儲所有同義詞子表的頭指針。

 

鏈地址法對於可能會造成很多衝突散列函數來說,提供了絕不會出現找不到地址的保障。但也就帶來了查找時需要遍歷單鏈表的性能損耗。

4. 公共溢出區法

爲所有衝突的關鍵字記錄建立一個公共的溢出區來存放。在查找時,對給定關鍵字通過散列函數計算出散列地址後,先與基本表的相應位置進行比對,如果相等,則查找成功;如果不相等,則到溢出表進行順序查找。如果相對於基本表而言,在有衝突的數據很少的情況下,公共溢出區的結構對查找性能來說還是非常高的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章