解決hash沖突的常用方法


原文:https://blog.csdn.net/xiajingsong/article/details/84491078

 

a)開放地址法

這個方法的基本思想是:當發生地址沖突時,按照某種方法繼續探測哈希表中的其他存儲單元,直到找到空位置為止。這個過程可用下式描述: 
H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… , k ( k ≤ m – 1)) 
其中: H ( key ) 為關鍵字 key 的直接哈希地址, m 為哈希表的長度, di 為每次再探測時的地址增量。 
采用這種方法時,首先計算出元素的直接哈希地址 H ( key ) ,如果該存儲單元已被其他元素占用,則繼續查看地址為 H ( key ) + d 2 的存儲單元,如此重復直至找到某個存儲單元為空時,將關鍵字為 key 的數據元素存放到該單元。 
增量 d 可以有不同的取法,並根據其取法有不同的稱呼: 
( 1 ) d i = 1 , 2 , 3 , …… 線性探測再散列; 
( 2 ) d i = 1^2 ,- 1^2 , 2^2 ,- 2^2 , k^2, -k^2…… 二次探測再散列; 
( 3 ) d i = 偽隨機序列 偽隨機再散列; 

例1設有哈希函數 H ( key ) = key mod 7 ,哈希表的地址空間為 0 ~ 6 ,對關鍵字序列( 32 , 13 , 49 , 55 , 22 , 38 , 21 )按線性探測再散列和二次探測再散列的方法分別構造哈希表。 
解:


( 1 )線性探測再散列: 
32 % 7 = 4 ; 13 % 7 = 6 ; 49 % 7 = 0 ; 
55 % 7 = 6 發生沖突,下一個存儲地址( 6 + 1 )% 7 = 0 ,仍然發生沖突,再下一個存儲地址:( 6 + 2 )% 7 = 1 未發生沖突,可以存入。 
22 % 7 = 1 發生沖突,下一個存儲地址是:( 1 + 1 )% 7 = 2 未發生沖突; 
38 % 7 = 3 ; 
21 % 7 = 0 發生沖突,按照上面方法繼續探測直至空間 5 ,不發生沖突,所得到的哈希表對應存儲位置: 
下標: 0 1 2 3 4 5 6 
49 55 22 38 32 21 13 


( 2 )二次探測再散列: 
下標: 0 1 2 3 4 5 6 
49 22 21 38 32 55 13 
    注意:對於利用開放地址法處理沖突所產生的哈希表中刪除一個元素時需要謹慎,不能直接地刪除,因為這樣將會截斷其他具有相同哈希地址的元素的查找地址,所以,通常采用設定一個特殊的標志以示該元素已被刪除。

b)再哈希法 

當發生沖突時,使用第二個、第三個、哈希函數計算地址,直到無沖突時。缺點:計算時間增加。比如上面第一次按照姓首字母進行哈希,如果產生沖突可以按照姓字母首字母第二位進行哈希,再沖突,第三位,直到不沖突為止

c)鏈地址法

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

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

d.建立一個公共溢出區

假設哈希函數的值域為[0,m-1],則設向量HashTable[0..m-1]為基本表,另外設立存儲空間向量OverTable[0..v]用以存儲發生沖突的記錄。
經過以上方法,基本可以解決掉hash算法沖突的問題。
注:之所以會簡單得介紹了hash,是為了更好的學習lzw算法,學習lzw算法是為了更好的研究gif文件結構,最后,我將詳細的闡述一下gif文件是如何構成的,如何高效操作此種類型文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM