Hash衝突解決方法

2021-08-25 02:37:50 字數 1453 閱讀 6943

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

1.開放位址法

開放位址法公式::h=(h(key)+di) mod m i=1,2,…,k(k<=m-1)

其中,m為雜湊表的表長。di是產生衝突的時候的增量序列。如果di的值可能為1,2,3,…,m-1,稱線性探測再雜湊。

如果di取1,則每次衝突以後,向後移動1個位置。

如果di取值為1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),稱二次探測再雜湊。

如果di取值可能為偽隨機數列,稱偽隨機探測再雜湊。

2.再雜湊法

當發生衝突時,使用第二個,第三個,雜湊函式計算位址,直到無衝突時。缺點:計算時間增加。比如上面第一次按照姓首字母進行雜湊,如果產生衝突可以按照姓字母首字母第二位進行雜湊,再衝突,第三位,直到不衝突。

3.拉鍊法

將hash值相同的鍵放入同一線性鍊錶之中。hashmap就用這種方法來解決衝突。

【例】設有 m = 5 , h(k) = k mod 5 ,關鍵字值序例 5 , 21 , 17 , 9 , 15 , 36 , 41 , 24 ,按外鏈位址法所建立的雜湊表如下圖所示:

4.建立乙個公共溢位區

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

優點:

①拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;

②由於拉鍊法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;

③開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;

④在用拉鍊法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。而對開放位址法構造的雜湊表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之後填人雜湊表的同義詞結點的查詢路徑。這是因為各種開放位址法中,空位址單元(即開放位址)都是查詢失敗的條件。因此在 用開放位址法處理衝突的雜湊表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。

缺點:

指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指標空間用來擴大雜湊表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查詢速度。

Hash衝突解決方法

假設hash表大小為5 即5個槽位 現在要把2,5,6,7,8這幾個數儲存到hash表中,假設hash函式為hash num num size 簡單計算下,第乙個數2的hash值為2所以放到第三個槽中,第二個數5的hash值為0放到第乙個槽中,第三個數6的hash值為1放到第二個槽中,如下圖所示 1...

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

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

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

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