哈希衝突詳解

微信搜索🔍「碼農田小齊」,關注這個在紐約的程序媛,回覆「01-05」能夠獲取計算機精選書籍、我的刷題筆記、大廠面經、面試資料等資源,麼麼噠~git

哈希衝突詳解

通常來講哈希衝突有兩大類解決方式[1]github

  1. Separate chaining
  2. Open addressing

Java 中採用的是第一種 Separate chaining,即在發生碰撞的那個桶後面再加一條「鏈」來存儲,那麼這個「鏈」使用的具體是什麼數據結構,不一樣的版本稍有不一樣:web

在 JDK1.6 和 1.7 中,是用鏈表存儲的,這樣若是碰撞不少的話,就變成了在鏈表上的查找,worst case 就是 O(n);面試

在 JDK 1.8 進行了優化,當鏈表長度較大時(超過 8),會採用紅黑樹來存儲,這樣大大提升了查找效率。微信

(話說,這個還真的喜歡考,已經在屢次面試中被問過了,還有面試官問爲何是超過「8」才用紅黑樹🤔)數據結構

第二種方法 open addressing 也是很是重要的思想,由於在真實的分佈式系統裏,有不少地方會用到 hash 的思想但又不適合用 seprate chainingkoa

這種方法是順序查找,若是這個桶裏已經被佔了,那就按照「某種方式」繼續找下一個沒有被佔的桶,直到找到第一個空的。編輯器

如圖所示,John Smith 和 Sandra Dee 發生了哈希衝突,都被計算到 152 號桶,因而 Sandra 就去了下一個空位 - 153 號桶,固然也會對以後的 key 發生影響:Ted Baker 計算結果本應是放在 153 號的,但鑑於已經被 Sandra 佔了,就只能再去下一個空位了,因此到了 154 號。分佈式

這種方式叫作 Linear probing 線性探查,就像上圖所示,一個個的順着找下一個空位。固然還有其餘的方式,好比去找平方數,或者 Double hashing.學習


若是你喜歡這篇文章,記得給我點贊留言哦~大家的支持和承認,就是我創做的最大動力,咱們下篇文章見!

我是小齊,紐約程序媛,終生學習者,天天晚上 9 點,雲自習室裏不見不散!

更多幹貨文章見個人 Github: https://github.com/xiaoqi6666/NYCSDE

參考資料

[1]

哈希衝突wiki: https://en.wikipedia.org/wiki/Hash_table

相關文章
相關標籤/搜索