哈希沖突及四種解決方法


哈希沖突的產生原因

哈希是通過對數據進行再壓縮,提高效率的一種解決方法。但由於通過哈希函數產生的哈希值是有限的,而數據可能比較多,導致經過哈希函數處理后仍然有不同的數據對應相同的值。這時候就產生了哈希沖突。

產生哈希沖突的影響因素

裝填因子(裝填因子=數據總數 / 哈希表長)、哈希函數、處理沖突的方法

解決哈希沖突的四種方法

1.開放地址方法

  (1)線性探測

   按順序決定值時,如果某數據的值已經存在,則在原來值的基礎上往后加一個單位,直至不發生哈希沖突。 

  (2)再平方探測

   按順序決定值時,如果某數據的值已經存在,則在原來值的基礎上先加1的平方個單位,若仍然存在則減1的平方個單位。隨之是2的平方,3的平方等等。直至不發生哈希沖突。

  (3)偽隨機探測

   按順序決定值時,如果某數據已經存在,通過隨機函數隨機生成一個數,在原來值的基礎上加上隨機數,直至不發生哈希沖突。

2.鏈式地址法(HashMap的哈希沖突解決方法)

  對於相同的值,使用鏈表進行連接。使用數組存儲每一個鏈表。

  優點:

  (1)拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;

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

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

  (4)在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。
  缺點:

  指針占用較大空間時,會造成空間浪費,若空間用於增大散列表規模進而提高開放地址法的效率。

3.建立公共溢出區

  建立公共溢出區存儲所有哈希沖突的數據。

4.再哈希法

  對於沖突的哈希值再次進行哈希處理,直至沒有哈希沖突。

 


免責聲明!

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



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