解決Hash衝突的4種辦法

2021-09-01 20:14:25 字數 1240 閱讀 1736

1)衝突是如何產生的?

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

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

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

位置字母姓名0

a1b2

c 10   

l    李四

...22

w王五,吳露

25 z 張三,趙剛

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

2)如何解決衝突問題

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

a)開放位址法

( 3 ) d i = 偽隨機序列 偽隨機再雜湊; 解:

注意:對於利用開放位址法處理衝突所產生的雜湊表中刪除乙個元素時需要謹慎,不能直接地刪除,因為這樣將會截斷其他具有相同雜湊位址的元素的查詢位址,所以,通常採用設定乙個特殊的標誌以示該元素已被刪除。

b)再雜湊法

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

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

c)鏈位址法

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

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

d.建立乙個公共溢位區

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

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

注:之所以會簡單得介紹了hash,是為了更好的學習lzw演算法,學習lzw演算法是為了更好的研究gif檔案結構,最後,我將詳細的闡述一下gif檔案是如何構成的,如何高效操作此種型別檔案。

學習筆記 解決Hash衝突的4種辦法

a 開放位址法 這個過程可用下式描述 hi key h key di mod m i 1,2,k k m 1 例1設有雜湊函式h key key mod 7,雜湊表的位址空間為0 6,對關鍵字序列 32 13 49 55 22 38 21 按線性探測再雜湊和二次探測再雜湊的方法分別構造雜湊表。解 1...

解決hash衝突的四種辦法

目錄 開放定址法 線性探測再雜湊 二次探測再雜湊 偽隨機探測再雜湊 再雜湊法 鏈位址法 建立公共溢位區 優缺點 開放雜湊 open hashing 拉鍊法 針對桶鏈結構 封閉雜湊 closed hashing 開放定址法 通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝...

hash衝突的通用解決辦法

hash演算法解決衝突的方法一般有以下幾種常用的解決方法 1,開放定址法 所謂的開放定址法就是一旦發生了衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將記錄存入 公式為 fi key f key di mod m di 1,2,3,m 1 用開放定址法解決衝突的做法是 ...