根據谷歌發現的維基百科和各種.edu網站等各種來源,散列表解決衝突的最常見方式是線性或二次探測和鏈接。簡要提及隨機探查,但沒有引起太多關注。我已經實現了一個使用隨機探測來解決衝突的散列表。假設存在衝突,分辨率的工作原理如下:爲什麼隨機化探測在哈希表實現中更受歡迎?
- 對象的完整(32位)散列用於播種線性同餘隨機數生成器。
- 生成器生成32位數字,並採用模數來確定接下來要探測的哈希表中的哪個位置。
這具有非常好的屬性,無論模數空間中有多少個散列衝突,只要32位完全沒有衝突,查找和插入時間預計爲O(1)散列空間。由於探測序列是僞隨機的,與線性探測不同,因爲模空間衝突不會導致聚集行爲。由於整個系統是開放地址的,並且不會在任何地方使用鏈接列表,因此與鏈接不同,您無需在每次插入時執行內存分配。另外,由於散列的大小通常是地址空間的大小(32位機器上的32位),所以根本不可能在地址空間中填充足夠的項目以導致大量的散列衝突在一個好的散列方案下的32位散列空間。
那麼爲什麼要隨機探測這種不受歡迎的衝突解決策略呢?
有趣。我的實現並不能保證它永遠不會多次訪問同一個插槽。我做了一些蒙特卡洛模擬,並得出結論,在實踐中,這種情況發生的頻率很低,無法擔心。即使您允許多次訪問相同的位置,您仍然可以獲得**預計的** O(1)查找時間。 – dsimcha