哈希沖突的產生原因
哈希是通過對數據進行再壓縮,提高效率的一種解決方法。但由於通過哈希函數產生的哈希值是有限的,而數據可能比較多,導致經過哈希函數處理后仍然有不同的數據對應相同的值。這時候就產生了哈希沖突。
產生哈希沖突的影響因素
裝填因子(裝填因子=數據總數 / 哈希表長)、哈希函數、處理沖突的方法
解決哈希沖突的四種方法
1.開放地址方法
(1)線性探測
按順序決定值時,如果某數據的值已經存在,則在原來值的基礎上往后加一個單位,直至不發生哈希沖突。
(2)再平方探測
按順序決定值時,如果某數據的值已經存在,則在原來值的基礎上先加1的平方個單位,若仍然存在則減1的平方個單位。隨之是2的平方,3的平方等等。直至不發生哈希沖突。
(3)偽隨機探測
按順序決定值時,如果某數據已經存在,通過隨機函數隨機生成一個數,在原來值的基礎上加上隨機數,直至不發生哈希沖突。
2.鏈式地址法(HashMap的哈希沖突解決方法)
對於相同的值,使用鏈表進行連接。使用數組存儲每一個鏈表。
優點:
(1)拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;
(2)由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
(3)開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;
(4)在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。
缺點:
指針占用較大空間時,會造成空間浪費,若空間用於增大散列表規模進而提高開放地址法的效率。
3.建立公共溢出區
建立公共溢出區存儲所有哈希沖突的數據。
4.再哈希法
對於沖突的哈希值再次進行哈希處理,直至沒有哈希沖突。
