Hash衝突解決方法

2021-08-26 12:10:42 字數 2385 閱讀 6454

假設hash表大小為5(即5個槽位),現在要把2,5,6,7,8這幾個數儲存到hash表中,假設hash函式為hash(num)=num % size

簡單計算下,第乙個數2的hash值為2所以放到第三個槽中,第二個數5的hash值為0放到第乙個槽中,第三個數6的hash值為1放到第二個槽中,如下圖所示:

1號槽2號槽

3號槽4號槽

5號槽562

第四個數7的hash值也為2,應該放到第二個槽位,但是第二個槽位中已經放有資料了,這種情況就屬於hash衝突。

簡單來說,就是兩個不同的資料經過hash函式計算之後得到了相同的hash值,這就叫做hash衝突。

開放位址法也稱為再雜湊法

基本原理

當關鍵字key的雜湊位址p=hash(key)出現衝突時,以hash值p為基礎,產生另乙個雜湊位址p1,如果p1仍然衝突,再以p為基礎,產生另乙個雜湊位址p2,…,直到找出乙個不衝突的雜湊位址pi ,然後將相應元素存入其中

基本公式

p = hash(key)

h = (p + di) % m

上面的公公式中:

1.hash(key)是根據關鍵字key計算得到的hash值p

2.di是乙個增量序列,根據這個增量序列取值的區分,開放位址法也有不同的區分

3.m是hash表的表長(表大小)

線性探測再雜湊

當上述公式中的增量序列di的取值為遞增順序取值時即為線性探測再雜湊

di = 1,2,3,4,5

... n-1,n (n <= m - 1)

這種方式在發生hash衝突時,會逐步向後移動乙個位置,順序的檢視下乙個槽位,一直到找出下乙個空的槽位或是直到查遍全表

當hash值p出現衝突時,則將資料放到(p + 1) % m處,如果此時還存在衝突,則將資料放到(p + 2) % m處,如果再次存在衝突,則將資料放到(p + 3) % m處,依次類推

二次探測再雜湊

di的取值規則如下時則稱為二次探測再雜湊

1*1,-1*1, 2*2,-2*2, 3*3,-3*3, ..., k*k,-k*k   (k <= m/2)
當hash值p出現衝突時,則將資料放到(p + 1) % m處,如果此時還存在衝突,則將資料放到(p - 1) % m處,如果再次存在衝突,則將資料放到(p + 4) % m處,如果依然存在衝突,則將資料放到(p - 4) % m處,依次類推

偽隨機探測再雜湊

di的取值是隨機數序列時則稱為偽隨機探測再雜湊

di =隨機數序列

//假設有個隨機數序列:2,8,3,5,11,6,7

當hash值p出現衝突時,則將資料放到(p + 2) % m處,如果此時還存在衝突,則將資料放到(p + 8) % m處,如果再次存在衝突,則將資料放到(p + 3) % m處,如果依然存在衝突,則將資料放到(p + 5) % m處,依次類推

缺點這種方式是構造多個不同的雜湊函式

hi = rhi(key)     i=1,2,3,...,k
當雜湊值hi = rh1(key)發生衝突時,再計算hi = rh2(key)….一直到不產生衝突為止。

優缺點這種方式不容易產生聚集,但是增加了計算時間

這種方法的原理是將所有雜湊值為i而導致衝突的元素構成乙個同義詞單鏈表,並將單鏈表的頭指標存在雜湊表的第i個槽位中。因此對雜湊值為i的元素的查詢、新增、刪除都是在此單鏈表中進行。結構如下圖

優點處理衝突簡單,無堆積現象,即非同義詞不會產生衝突,平均查詢路徑較短

鏈位址法中各鍊錶的節點空間都是動態申請的,因此鏈位址法比較適合構造hash表前無法確定表長的業務場景

鏈位址法構造的雜湊表刪除操作比較容易實現,只需要簡單的刪除鍊錶上對應的節點即可 缺點

鏈位址法的指標需要額外的空間

這種方法的原理是將雜湊表分為基本表和溢位錶兩部分,凡是和基本表中元素發生衝突的元素均存入溢位表

Hash衝突解決方法

當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位。因此,處理衝突和溢位是 雜湊技術中的兩個重要問題。1.開放位址法 開放位址法公式 h h ke...

Hash演算法衝突解決方法分析

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

Hash演算法衝突解決方法分析

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