hash衝突處理

2021-06-02 23:40:55 字數 1569 閱讀 4084

1)衝突是如何產生的?

上文中談到,雜湊函式是指如何對關鍵字進行編址的規則,這裡的關鍵字的範圍很廣,可視為無限集,如何保證無限集的原資料在編址的時候不會出現重複呢?規則本身無法實現這個目的。舉乙個例子,仍然用班級同學做比喻,現有如下同學資料

張三,李四,王五,趙剛,吳露.....

假如我們編址規則為取姓氏中姓的開頭字母在字母表的相對位置作為位址,則會產生如下的雜湊表

位置字母姓名0

a1b2

c ...10   

l    李四

...22

w王五,吳露 ..

25z張三,趙剛

我們注意到,灰色背景標示的兩行裡面,關鍵字王五,吳露被編到了同乙個位置,關鍵字張三,趙剛也被編到了同乙個位置。老師再拿號來找張三,座位上有兩個人,"你們倆誰是張三?"

2)如何解決衝突問題

既然不能避免衝突,那麼如何解決衝突呢,顯然需要附加的步驟。通過這些步驟,以制定更多的規則來管理關鍵字集合,通常的辦法有:

a)開放位址法

開放地執法有乙個公式:hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1)

其中,m為雜湊表的表長。di 是產生衝突的時候的增量序列。如果di值可能為1,2,3,...m-1,稱線性探測再雜湊。

如果di取1,則每次衝突之後,向後移動1個位置.如果di取值可能為1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2) 

稱二次探測再雜湊。如果di取值可能為偽隨機數列。稱偽隨機探測再雜湊。仍然以學生排號作為例子,

現有兩名同學,李四,吳用。李四與吳用事先已排好序,現新來一名同學,名字叫王五,對它進行編制

10..

....

22..

..25

李四..

....

吳用..

..25

趙剛未來之前

10..

..22

2325

李四..

吳用王五

(a)線性探測再雜湊對趙剛進行編址,且di=1

10...

2022

..25

李四..

王五吳用

(b)二次探測再雜湊,且di=-2 

1...

10...

22..

25王五..

李四..吳用

(c)偽隨機探測再雜湊,偽隨機序列為:5,3,2

b)再雜湊法

當發生衝突時,使用第二個、第三個、雜湊函式計算位址,直到無衝突時。缺點:計算時間增加。

比如上面第一次按照姓首字母進行雜湊,如果產生衝突可以按照姓字母首字母第二位進行雜湊,再衝突,第三位,直到不衝突為止

c)鏈位址法

將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。如下:

因此這種方法,可以近似的認為是筒子裡面套筒子

d.建立乙個公共溢位區

假設雜湊函式的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立儲存空間向量overtable[0..v]用以儲存發生衝突的記錄。

經過以上方法,基本可以解決掉hash演算法衝突的問題。

處理Hash衝突的方法

1 開發定址發 h i h key di mod m 其中i 1,2,3 m 1 m hash表的長度 h key 為hash函式 di為增量序列,序列的意思是如果得到的h i 上已經有元素,取di 1。根據di的取值方式不同可以分為3中情況 1 線性探測再雜湊 這是di取值為1,2,3 m 1,缺...

hash函式以及衝突處理

最常用的3個hash函式 1.除法雜湊法 通過取k除以m的餘數,來將關鍵字k對映到m個槽的某乙個中去,即雜湊函式為 h k k mod m 2.乘法雜湊法 首先,用關鍵字k乘上常數a 0 h k m ka mod 1 3.全域雜湊法 universal hashing 4平方取中法 5.摺疊法 解決...

hash衝突及處理演算法

看了concurrenthashmap的實現,使用的是拉鍊法.雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅...