hash表中的元素儲存位址是通過hash函式計算出來的,當要取出指定元素的時候,直接通過hash函式計算出元素的儲存位址。有時候會出現key不同,但是通過hash函式計算出來的值相同,這個值相同意味著這兩個key要存在同一位置,這顯然不對,這就是hash衝突。
hash函式有多種構造方法,常見的有直接定址法、數字分析法、平方取中法、摺疊法、除留餘數法、隨機數法等,這裡選擇除留餘數法。
解決hahs衝突也有多種方法,比如:開放定址法、再雜湊法、鏈位址法、建立乙個公共溢位區等。這裡重點介紹兩種,線性探測法和鏈位址法。
hash表的裝載因子 = 關鍵字總數/雜湊表的長度。比如關鍵字總數為7,hash表長度為10,那麼裝載因子為0.7。
當碰到hash衝突的時候,多次雜湊,線性探測儲存位置。對於關鍵字ki
,求得hash函式的值hi
,但是在位址hi
處已經存放了元素,那麼在hi
繼續雜湊,求hi
+1,hi+
1 = (hi
+ 1)%l,直到遇到空白儲存區。
成功時的平均查詢長度為每個元素的雜湊次數的總和/元素總數;
失敗時的平均查詢長度為0~l-1的查詢次數的總和/hash表長度。失敗的查詢意思就是這個元素注定在該表中找不到,所以在遇到空白儲存區之前會一直往下查詢,遇到空白儲存區停止,因為如果這個數真的存在那麼一定會存在空白儲存區,遇到空白儲存區還沒有找到說明不存在,這個時候就可以停止查詢了。
鏈位址法
開位址法
線性探測法
雜湊衝突
鏈位址法
Hash函式和Hash衝突
2.rehash 3.鍊錶法 4.建立公共溢位區 一 簡介 將任意長度的數值以某個對映規則對映為固定長度的數值,這個過程稱為hash,而這個對映規則被稱為hash函式,而對這個key value進行儲存的資料結構被稱為hash表。由於通過key的hash對映直接得到了記憶體位址,所以hash查詢的時...
hash,解決hash衝突的方法
數字分析法 平方取中法 除留餘數法 偽隨機數法 線性探測 二次探測 偽隨機數探測 拉鍊探測。如果負載因子是預設的0.75,hashmap 16 的時候,佔16個記憶體空間,實際上只用到了12個,超過12個就擴容。如果負載因子是1的話,hashmap 16 的時候,佔16個記憶體空間,實際上會填滿16...
hash衝突處理
1 衝突是如何產生的?上文中談到,雜湊函式是指如何對關鍵字進行編址的規則,這裡的關鍵字的範圍很廣,可視為無限集,如何保證無限集的原資料在編址的時候不會出現重複呢?規則本身無法實現這個目的。舉乙個例子,仍然用班級同學做比喻,現有如下同學資料 張三,李四,王五,趙剛,吳露.假如我們編址規則為取姓氏中姓的...