當前位置:吉日网官网 - 傳統美德 - 壹文理解哈希沖突四種解決方法

壹文理解哈希沖突四種解決方法

哈希是通過對數據進行再壓縮,提高效率的壹種解決方法。但由於通過哈希函數產生的哈希值是有限的,而數據可能比較多,導致經過哈希函數處理後仍然有不同的數據對應相同的索引值。這時候就產生了 哈希沖突 ( 兩個值都需要同壹個地址索引位置 )。

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

其實也就是哈希表的實現 。

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

視頻(非常易懂)

  • 上一篇:快遞運費怎麽算?
  • 下一篇:我們能為保護民間藝術做些什麽?
  • copyright 2024吉日网官网