資料結構 處理雜湊衝突的方法

2021-07-31 12:28:28 字數 2303 閱讀 4717

摘自大話資料結構

我們設計得再好的雜湊函式也不可能完全避免衝突,這就像我們再健康也只能盡量預防疾病,但卻無法保證永遠不得病一樣,既然衝突不能避免,就要考慮如何處理它。

那麼當我們在使用雜湊函式後發現兩個關鍵字key1≠key2,但是卻有f(key1) = f(key2),即有衝突時,怎麼辦呢?我們可以從生活中找尋思路。

試想一下,當你觀望很久很久,終於看上一套房打算要買了,正準備下訂金,人家告訴你,這房子已經被人買走了,你怎麼辦?對呀,再找別的房子唄!這其實就是一種處理衝突的方法開放定址法。

它的公式是:

fi

(key) = (f(key)+di) mod m

(di=1,2,3,......,m-1)

比如說,我們的關鍵字集合為,表長為12。 我們用雜湊函式f(key) = key mod l2。

計算key = 37時,發現f(37) = 1,此時就與25所在的位置衝突。

接下來22,29,15,47都沒有衝突,正常的存入:

到了 key=48,我們計算得到f(48) = 0,與12所在的0位置衝突了,不要緊,我們f(48) = (f(48)+1) mod 12 = 1,此時又與25所在的位置衝突。於是f(48) = (f(48)+2) mod 12=2,還是衝突……一直到 f(48) = (f(48)+6) mod 12 = 6時,才有空位,機不可失,趕快存入:

我們把這種解決衝突的開放定址法稱為線性探測法

從這個例子我們也看到,我們在解決衝突的時候,還會碰到如48和37這種本來都不是同義詞卻需要爭奪乙個位址的情況,我們稱這種現象為堆積。很顯然,堆積的出現,使得我們需要不斷處理衝突,無論是存入還是查詢效率都會大大降低。

考慮深一步,如果發生這樣的情況,當最後乙個key=34,f(key)=10,與22所在的位置衝突,可是22後面沒有空位置了,反而它的前面有乙個空位置,儘管可以 不斷地求餘數後得到結果,但效率很差。

因此我們可以改進di = 12, -12, 22, -22,……, q2, -q2 (q <= m/2),這樣就等於是可以雙向尋找到可能的空位置。

對於34來說,我 們取di即可找到空位置了。另外增加平方運算的目的是為了不讓關鍵字都聚集在某一塊區域。我們稱這種方法為二次探測法

還有一種方法是,在衝突時,對於位移量 di 採用隨機函式計算得到,我們稱之為隨機探測法

此時一定會有人問,既然是隨機,那麼查詢的時候不也隨機生成辦嗎?如何可以獲得相同的位址呢?這是個問題。這裡的隨機其實是偽隨機數。

偽隨機數是說,如果我們設定隨機種子相同,則不斷呼叫隨機函式可以生成不會重複的數列,我們在查詢時,用同樣的隨機種子,它每次得到的數列是相同的,相同的 di 當然可以得到相同的雜湊位址。

總之,開放定址法只要在雜湊表未填滿時,總是能找到不發生衝突的位址,是我們常用的解決衝突的辦法。

對於我們的雜湊函式來說,我們事先準備多個雜湊函式。

這裡rhi 就是不同的雜湊函式。每當發生雜湊衝突的時候,就換乙個雜湊函式計算,相信總會有乙個可以吧衝突解決掉。這種方法能夠使得關鍵字不聚集,當然,相應地也增加了計算的時間。

思路還可以再緩一緩,為什麼有衝突就要換地方,我們直接在原地想辦法可以嗎?於是就有了鏈位址法。

將所有關鍵字為同義詞的記錄儲存在乙個單鏈表中,我們稱這種表為同義詞表,在雜湊中只儲存所有同義詞子表的頭指標。對於關鍵字,我們用前面同樣的餘數12位除數,進行除留餘數法,可得到如下圖所示的結構。此時,已經不存在什麼衝突換址的問題了,無論有多少衝突,都只是在當前位置給單鏈表增加節點即可。

鏈位址法對於可能會造成很多衝突的雜湊來說,提供了絕不會出現找不到位址的保障。當然,這也就帶來了查詢時需要遍歷單鏈表的效能損耗。

這個方法其實就更加好理解,你不是衝突嗎?好吧,凡是衝突的都跟我走,我給你們這些衝突找個地兒待著。這就如同孤兒院收留所有無家可歸的孩子一樣,我們為所有衝突的關鍵字建立了乙個公共的溢位區來存放。

就前面的例子而言,我們共有三個關鍵字與之前的關鍵字位置有衝突,那麼就將它們儲存到溢位表中。

在查詢時,對給定值通過雜湊函式計算出雜湊位址後,先與基本表的相應位置進行比對,如果相等,則查詢成功;如果不相等,則到溢位表去進行順序查詢。如果相對於基本表而言,有衝突的資料很少的情況下,公共溢位區的結構對查詢效能來說還是非常高的。

資料結構 閉雜湊處理雜湊衝突(線性探測)

那發生了雜湊衝突,我們該如何處理呢?有兩種方法 1.閉雜湊,如線性探測 2.開雜湊,例如 雜湊桶 這裡我們用閉雜湊的方式來解決雜湊衝突。那如何去找下乙個空餘的位置呢?線性探測法,拿我們上次的關鍵碼集合為例,雜湊表的大小為10,假設雜湊函式為hash key key 10 當再往表裡插入43時,發現了...

雜湊表and處理衝突的方法

雜湊法又稱雜湊法 雜湊法以及關鍵字位址計算法等,相應的表稱為雜湊表。這種方法的基本思想是 首先在元素的關鍵字k和元素的儲存位置p之間建立乙個對應關係f,使得p f k f稱為雜湊函式。建立雜湊表時,把關鍵字為k的元素直接存入位址為f k 的單元 以後當查詢關鍵字為k的元素時,再利用雜湊函式計算出該元...

雜湊表處理衝突的方法

fi key f key di mod m di 1,2,3,4,m 1 會出現不是同義詞卻需要爭奪乙個位址的情況,我們稱這種情況為堆積。關鍵字集合 12,67,56,16,25,37,22,29,15,47,48,34 下標0 1234 5678 91011關鍵字 1225 3715 1629 4...