哈希表(一):解決hash沖突的幾種方法


(一)線性探測法

線性探測法是最簡單的處理沖突的方法。

(1)插入元素:插入元素時,如果發生沖突,算法將從該槽位向后遍歷哈希表,直到找到表中的下一個空槽,並將該值放入到空槽當中。

(2)查找元素:查找元素時,首先散列值所指向的槽,如果沒有找到匹配,則繼續從該槽向后遍歷哈希表,直到:1)找到相應的元素;2)找到一個空槽(指示查找的元素不存在);3)整個哈希表都遍歷完畢(指示該元素不存在並且哈希表已滿)

線性探測法存在的缺點:

(1)處理溢出需要另編程序。一般可以設立一個溢出表,用來存放上述哈希表中放不下的記錄。此溢出表最簡單的結構是順序表,查找方法可用順序查找;

(2)刪除工作很復雜。因為一旦對某一個元素刪除后,該位置出現空槽,后續查找到該空槽時會認為該元素不存在。需要一種方法對刪除元素進行標記;

(3)由於每次都是線性遞增,容易導致堆聚,即存入哈希表的記錄在表中都連成一片,后續發生沖突的可能性會越大。

 

(二)二次探測法

本質和線性探測法較類似,只不過線性探測法按照1,2,3,4……的步長進行探測,二次探測法按照1,4,9,16……即平方的方式進行探測。

89: 89 % 10 = 9

18:18 % 10 = 8

49:49 % 10 = 9,遞增1,循環走到0位置

58:58 % 10 = 8,遞增1,遞增4(從8的位置算),循環走到2;

9:9 % 10 = 9,遞增1,遞增4(從9的位置算),循環走到3。

 

(三)鏈地址法

也成為拉鏈法。其基本思路為:將所有具有相同哈希地址的而不同關鍵字的元素連接到同一個單鏈表中。如果選定的哈希表長度為m,則可以將哈希表定義為一個有m個頭指針組成的指針數組。凡是給定哈希地址為i的元素,均以節點的形式插入到下標為i的頭指針單鏈表中。並且最新的元素插入到鏈表的前端,這不僅因為方便,還因為一個經常發生的事實是:最新插入的元素最有可能不久又被訪問。

實例圖:

對於沖突的哈希值,將其鏈入到該地址所對應的鏈表頭中。

鏈地址法的特點:

(1)沖突處理簡單,並且沒有堆積現象;

(2)由於鏈地址法各個鏈表上的結點空間時動態申請的,所以比較適合於造表前沒有確定表長的情況;

(3)刪除結點的操作比較容易實現,直接對鏈表中的結點刪除即可。

 


免責聲明!

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



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