推演 hashmap 原理
阿新 • • 發佈:2018-11-06
hash演算法查詢的基本思想:
- 假設存在一種hash演算法,使得每個物件的hash值都不同
- 那麼給定一個足夠大的陣列,將每個物件儲存在其hash值所對應的下標位置。
- 這樣再查詢該物件時,只要算出其hash值就可以立刻找到該物件
問題一:不存在使得每個物件hash值都唯一的演算法,即如何解決hash衝突?
有兩種方法可以解決
1. 開地址法
2. 連結法(java hashmap中用的就是這個,下面也只說這個)
使用如下的資料結構:
如果hash衝突,就在該hash所指向的連結串列中進行插入。
這也是為什麼java中要求定義一個物件時,要同時定義其 hash演算法 和 equesls演算法的原因。
問題二:不可能給定一個足夠大的陣列,即如何在保證時間開銷的情況下同時保證記憶體開銷?
使用兩個元素來滿足這一點
1. hash表的長度
2. 雜湊因子
我們不能在計算機中使用一個足夠大的陣列,所以可以給hash表初始一個長度L。
在新增一個物件時,以 hash%L 的值作為其儲存的下標位置
這樣一來 hash 衝突的概率必然增加,這時雜湊因子的作用就來了
可以設定雜湊因子為 0.75,也就是說將hash表中 75% 的下標位置都已存在相就物件時,就對hash表進行擴容(hashmap 就是這樣搞的,擴容的倍數為原來的2倍)
(話說最好hash表的長度都是 2的倍數,這樣有利什麼來著也不深究了,適可而止吧)