淺談雜湊法及其解決衝突的方法

筱葭發表於2017-03-12

雜湊法又稱雜湊法,相應的表稱為雜湊表。

 

基本思想:首先在元素的關鍵字k和元素的儲存位置p之間建立一個對應關係f,使得p=f(k),f稱為雜湊函式。建立雜湊表時,把關鍵字為k的元素直接存入地址為f(k)的單元;以後當查詢關鍵字為k的元素時,再利用雜湊函式計算出該元素的儲存位置p=f(k),從而達到按關鍵字直接存取元素的目的。

 

衝突:當關鍵字集合很大時,關鍵字值不同的元素可能會映象到雜湊表的同一地址上,即 k1≠k2 ,但 f(k1) =f(k2),此時稱k1和k2為同義詞。實際中,衝突是不可避免的,只能通過改進雜湊函式的效能來減少衝突。

 

因此雜湊法需要注意兩個問題:

① 如何構造雜湊函式 

② 如何處理衝突

 

構造雜湊函式的原則主要有兩個:

③ 函式本身便於計算;

④ 計算出來的地址分佈均勻,即對任一關鍵字k,f(k) 對應不同地址的概率相等,目的是儘可能減少衝突。

 

通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另一個關鍵問題。常用的解決衝突方法主要有三種:

① 開放定址法(再雜湊法):

基本思想:當關鍵字k的雜湊地址p=f(k) 出現衝突時,以p為基礎,產生另一個雜湊地址p1,如果p1仍然衝突,再以p為基礎,產生另一個雜湊地址p2,…,直到找出一個不衝突的雜湊地址pi ,將相應元素存入其中。

這種方法有一個通用的再雜湊函式形式:fi = (f(k) + di) % m,i = 1, 2, …, n,其中f(k)為雜湊函式,m 為表長,di稱為增量序列。增量序列的取值方式不同,相應的再雜湊方式也不同,主要有以下3種:

a. 線性探測再雜湊:di = 1, 2, …, m - 1,衝突發生時,順序檢視錶中下一單元,直到找出一個空單元或查遍全表。

b. 二次探測再雜湊:di = 12, -12, 22, -22, …, k2, -k2(k <= m / 2),衝突發生時,在表的左右進行跳躍式探測,比較靈活。

c. 偽隨機探測再雜湊:di = 偽隨機數序列,建立一個偽隨機數發生器,如i = (i + p) % m,並給定一個隨機數做起點。

② 再雜湊法

同時構造多個不同的雜湊函式,當雜湊地址f1(k) 發生衝突時,再計算f2(k),…,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

③ 鏈地址法

基本思想:將所有雜湊地址為i的元素構成一個稱為同義詞鏈的單連結串列,並將單連結串列的頭指標存在雜湊表的第i個單元中,因而查詢、插入和刪除主要在同義詞鏈中進行。鏈地址法適用於經常進行插入和刪除的情況。

相關文章