java 雜湊衝突

2021-08-18 06:15:17 字數 1465 閱讀 2842

本文主要討論解決雜湊衝突的幾種方法。

什麼是雜湊衝突?

由於雜湊演算法被計算的資料是無限的,而計算後的結果範圍有限,因此總會存在不同的資料經過計算後得到的值相同,這就是雜湊衝突。(兩個不同的資料計算後的結果一樣)

解決雜湊衝突的幾種方法

大致有四種方法:

1. 開放定址法(再雜湊法)

線行探查法

平方探查法

雙雜湊函式探查法

2. 鏈位址法(拉鍊法)

3. 再雜湊法

4. 建立公共溢位區

1. 開放定址法

從發生衝突的那個單元起,按照一定的次序,從雜湊表中找到乙個空閒的單元,然後把發生衝突的元素存入到該單元的一種方法。

開發定址法需要的表長度要大於等於所需要存放的元素

在開發定址法中解決衝突的方法有:

1. 線行探查法

2. 平方探查法

3. 雙雜湊探查法

開放定址法缺點:

刪除元素的時候不能真的刪除,否則會引起查詢錯誤。

只能做乙個標記,直到有下個元素插入才能真正刪除該元素。

1.1 線行探查法

線行探查法是開放定址法中最簡單的衝突處理方法,它從發生衝突的單元起,依次判斷下乙個單元是否為空,當達到最後乙個單元時,再從表首依次判斷。直到碰到空閒的單元或者探查完全部單元為止。

1.2 平方探查法

平方探查法即是發生衝突時,用發生衝突的單元d[i], 加上 1²、 2²等。即d[i] + 1²,d[i] + 2², d[i] + 3²…直到找到空閒單元。

在實際操作中,平方探查法不能探查到全部剩餘的單元。不過在實際應用中,能探查到一半單元也就可以了。若探查到一半單元仍找不到乙個空閒單元,表明此雜湊表太滿,應該重新建立。

1.3 雙雜湊函式探查法

這種方法使用兩個雜湊函式hl和h2。其中hl和前面的h一樣,以關鍵字為自變數,產生乙個0至m—l之間的數作為雜湊位址;h2也以關鍵字為自變數,產生乙個l至m—1之間的、並和m互素的數(即m不能被該數整除)作為探查序列的位址增量(即步長),探查序列的步長值是固定值l;對於平方探查法,探查序列的步長值是探查次數i的兩倍減l;對於雙雜湊函式探查法,其探查序列的步長值是同一關鍵字的另一雜湊函式的值。

2. 鏈位址法

鏈結位址法的思路是將雜湊值相同的元素構成乙個同義詞的單鏈表,並將單鏈表的頭指標存放在雜湊表的第i個單元中,查詢、插入和刪除主要在同義詞鍊錶中進行。鍊錶法適用於經常進行插入和刪除的情況。

3. 再雜湊法

就是同時構造多個不同的雜湊函式:

hi = rhi(key) i= 1,2,3 … k;

當h1 = rh1(key) 發生衝突時,再用h2 = rh2(key) 進行計算,直到衝突不再產生,這種方法不易產生聚集,但是增加了計算時間。

4. 建立公共溢位區

將雜湊表分為公共表和溢位表,當溢位發生時,將所有溢位資料統一放到溢位區。

參考

雜湊表,雜湊衝突

什麼是雜湊表?雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。關鍵字 雜湊函式 雜湊函式 雜湊位址 優點 一對一的查詢...

雜湊衝突之雜湊法

雜湊碰撞 雜湊衝突 不同的key值經過雜湊函式hash key 處理以後可能產生相同的值雜湊位址,我們稱這種情況為雜湊衝突。任意的雜湊函式都不能避免產生衝突。閉雜湊法 線性探測 void insert1 int x pos if pos v.capacity s pos exist v pos x ...

雜湊 雜湊函式 衝突處理

例 如果我們現在要統計的是80後出生年份的人口數,那麼我們對出生年份這個關鍵字可以用年份減去1980來作為位址。此時f key key 1980。這樣的雜湊函式優點就是簡單 均勻,也不會產生衝突,但問題是這需要事先知道關鍵字的分布情況,適合查詢表較小且連續的情況。由於這樣的限制,在現實應用中,直接定...