鏈接在哈希表
回答
是的,當然。通常引用的散列表的O(1)假設完美的散列 - 其中沒有兩個不相同的條目解析爲相同的散列。
在實踐中,這將不會是這樣。你會一直有(爲了一個足夠大的數據集)碰撞。無論您是使用鏈接還是其他碰撞解決方法,碰撞都意味着查找時會有更多工作。
這就是爲什麼要選擇具有良好的設計/寫一個好的哈希函數這是非常非常重要的,有良好的匹配數據,你會使用爲您的哈希表的關鍵。在實踐中,不同類型的數據會使用不同的散列函數更好地散列。
這不是他問的問題。他特意詢問一旦他已經發生碰撞後應該怎麼做 - 如果他索引或排列該列表,如果他有這種複雜性問題,會是什麼? – 2012-04-25 17:50:04
可以想像,你選擇你的哈希算法和地圖的大小,以減輕碰撞,你會在第一時間得到的數字。此時,您應該在任何位置都有一個非常小的列表(理想情況下是一個或兩個元素),因此在鏈中維護排序結構的額外工作肯定不僅僅是迭代該存儲桶中的少量項目。
從理論上講:是的,因爲在一般情況下,你只需要步行半鏈找到,如果一個項目在連鎖與否。
在實踐中,有可能是沒有太大的區別,因爲鏈通常很短,而增加了代碼的複雜性也將花費一定的週期,主要表現在「插入」情況。
順便說一句:在大多數情況下的時隙數大於所述散列值的「密鑰空間」小得多。如果您能夠承擔該空間,則將散列值存儲在鏈節點中將節省重新計算每一跳上的散列值,並且將避免大部分最終比較。這當然是一個空間< - >時間折衷。如:
struct hashnode **this;
for (this=& table[slot] ; *this; this = &(*this)->link) {
if ((*this)->hash != the_hash) continue;
if (compare ((*this)->payload , the_value)) continue;
break;
}
/* at this point "this" points to the pointer that points to the wanted element,
or to the NULL-pointer where it should be inserted.
For the sorted-list example, you should instead break out of the loop
if the compare function returns > 0, and handle that special case here.
*/
- 1. 哈希錶鏈接
- 2. 鏈式哈希錶鏈接列表
- 3. 帶鏈接的哈希表(表加倍)
- 4. 哈希錶鏈puttall()
- 5. F#中的哈希鏈接和.net中的弱哈希表
- 6. C++哈希錶鏈接錯誤
- 7. Python中的鏈接哈希表
- 8. 使用鏈接的快速哈希表
- 9. 如何用鏈接實現哈希表?
- 10. 單獨鏈接的哈希表
- 11. 鏈接列表哈希紅寶石
- 12. jquery鏈接和URL哈希
- 13. Beautifulsoup和哈希鏈接#
- 14. 哈希鏈接後滾動
- 15. 鏈式哈希表聲明
- 16. 如何刪除哈希表中的O(1)雙鏈接鏈接?
- 17. 在URL中禁用哈希鏈接JavaScript
- 18. 用鏈接替換鏈接哈希使用鏈接
- 19. 參考哈希鍵的鏈哈希一個Perl哈希
- 20. 哈希表 - 鏈表 - 分段錯誤
- 21. Ember中的哈希鏈接href位置
- 22. 向custon js accordion添加哈希鏈接
- 23. 如何反向鏈接哈希映射?
- 24. 鏈接與PHP錨點和哈希
- 25. 使用鏈接的哈希映射
- 26. 哈希固定鏈接的jQuery循環
- 27. 從網址抓取哈希鏈接
- 28. IE火狐VS鏈接(哈希VS HTM5)
- 29. JavaScript的哈希標籤鏈接
- 30. C++哈希:開放尋址和鏈接
你的意思是像地圖一樣<鍵,列表>吧? –
ControlAltDel
2012-04-25 17:40:26
@ user1291492我認爲他的意思更像這樣:http://en.wikipedia.org/wiki/Hash_table#Separate_chaining – pstrjds 2012-04-25 17:42:05