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