裝填因子(裝填因子=數據總數 / 哈希表長)、哈希函數、處理沖突的方法
其實也就是哈希表的實現 。
1.開放地址方法(再散列法)
可以通俗理解為所有的地址都對所有的數值開放,而不是鏈式地址法的封閉方式,壹個數值固定在壹個索引地址位置。
p1=hash(key)如果沖突就在p1地址的基礎上+1或者散列處理,p2=hash(p1)....
(1)線性探測
按順序決定值時,如果某數據的值已經存在,則在原來值的基礎上往後加壹個單位,直至不發生哈希沖突。
(2)再平方探測
按順序決定值時,如果某數據的值已經存在,則在原來值的基礎上先加1的平方個單位,若仍然存在則減1的平方個單位。隨之是2的平方,3的平方等等。直至不發生哈希沖突。
和線性探測相比就是改變探測了步長。因為如果都是+1來探測在數據量比較大的情況下,效率會很差。
(3)偽隨機探測
按順序決定值時,如果某數據已經存在,通過隨機函數隨機生成壹個數,在原來值的基礎上加上隨機數,直至不發生哈希沖突。
2.鏈式地址法(HashMap的哈希沖突解決方法)
對於 相同的值,使用鏈表進行連接 。使用數組存儲每壹個鏈表。
優點:
(1)拉鏈法 處理沖突簡單,且無堆積現象 ,即非同義詞決不會發生沖突,因此平均查找長度較短;
(2)由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
(3)開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;
(4)在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。
缺點:
指針占用較大空間時,會造成空間浪費 ,若空間用於增大散列表規模進而提高開放地址法的效率。
3.建立公***溢出區
建立公***溢出區存儲所有哈希沖突的數據。
4.再哈希法
對於沖突的哈希值再次進行哈希處理,直至沒有哈希沖突。
可以理解為p=hash(key)如果沖突就p=hash2(key)....
參考文獻:
文章1
視頻(非常易懂)