哈希表如何避免哈希沖突


開放尋址法和鏈表法

開放尋址法

核心思想是,如果出現了散列沖突,我們就重新探測一個空閑位置,將其插入。
(1) 線性探測:我們就從當前位置開始,依次往后查找,看是否有空閑位置,直到找到為止。還記得我們剛講的查找操作嗎?在查找的時候,一旦我們通過線性探測方法,找到一個空閑位置,我們就可以認定散列表中不存在這個數據。但是,如果這個空閑位置是我們后來刪除的,就會導致原來的查找算法失效。本來存在的數據,會被認定為不存在。這個問題如何解決呢?我們可以將刪除的元素,特殊標記為 deleted。當線性探測查找的時候,遇到標記為 deleted 的空間,並不是停下來,而是繼續往下探測
(2) 二次探測:探測步長不同,二次探測探測的步長就變成了原來的“二次方”,也就是說,它探測的下標序列就是 hash(key)+0,hash(key)+12,hash(key)+22
(3) 雙重散列:有沖突就找第二個散列函數,再有再加

鏈表法

是一種更加常用的散列沖突解決辦法,相比開放尋址法,它要簡單很多。在散列表中,每個“桶(bucket)”或者“槽(slot)”會對應一條鏈表,所有散列值相同的元素我們都放到相同槽位對應的鏈表中。

優缺點:

開放尋址法:都在數組里,序列化簡單,沖突代價高,刪除麻煩,裝載因子不能太大,浪費內存空間
鏈表:內存利用率高,存儲小對象的時候,你還要存儲指針,比較消耗內存。我總結一下,基於鏈表的散列沖突處理方法比較適合存儲大對象、大數據量的散列表,而且,比起開放尋址法,它更加靈活,支持更多的優化策略,比如用紅黑樹代替鏈表。


免責聲明!

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



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