爲什麼我們使用散列進行搜索?在二叉搜索樹上使用散列有什麼優點?爲什麼我們在哪裏使用哈希?
回答
維基百科解釋說得好:
http://en.wikipedia.org/wiki/Hash_table#Features
摘要:插入一般都是緩慢的,讀取比樹木快得多。對於Java:任何時候當你有一些讀/寫很多的鍵/值對,並且一切都很容易寫入RAM時,使用HashTable進行快速讀取訪問和難以置信的簡單代碼維護。
散列通常是一個常數時間的操作而二叉樹具有對數時間複雜度。
因爲散列不是基於要搜索的集合中,但關於該項目的項目的數量來計算集合的大小上有需要找到一個項目的時間沒有關係。然而,大多數散列算法會產生衝突,從而增加了時間複雜度,因此很難獲得完美的恆定時間查找。
用二叉樹,你必須做的最多log2N比較可以發現該項目之前。
可是啊(log2(n))來確認項目不存在,而不是接近O(1)以進行有效的哈希查找。 – 2011-02-25 13:52:26
散列意味着使用一些函數或 算法將對象數據映射到一些代表性的整數值。這 所謂的散列碼(或簡稱爲散列) 可以被用來作爲一種尋找地圖中的 項目時縮小 了我們的搜索。
如果需要使用的算法的 快速用於查找信息 ,你需要那麼哈希表是 最合適的算法使用,因爲 它只是生成您 密鑰對象的哈希和使用那要訪問 的目標數據 - 它是O(1)。 其他是O(N)(大小爲 的鏈接列表N - 您必須逐個遍歷一個列表,平均爲N/2個)和O(log N)(二叉樹 - 您的 減半每次迭代 搜索空間 - 只有當樹 的平衡,這取決於你的 實現,一個不平衡的樹可以 具有性能顯著惡化)。
哈希表是最好的用於搜索(=)如果具有較低的插入和均勻的時隙分佈。時間複雜度爲O(n + k) - 線性。
他們不是一個好主意,如果你想要做的比較操作(<,>)
...或有排序的集合。 – 2011-02-25 13:53:03
- 1. 我們可以把哈希表放在哈希表裏面嗎?
- 2. 我們在哪裏以及爲什麼使用界面? C#
- 3. 爲什麼我們在HashTable中使用哈希代碼而不是索引?
- 4. 爲什麼我們需要在哈希導航URL中使用爆炸標記?
- 5. 爲什麼我們需要在extjs中使用childEls - 在哪裏使用?
- 6. 爲什麼我的哈希不是undef?
- 7. 什麼是指導自動化,我們在哪裏使用...?
- 8. 什麼是PEGA工具,我們在哪裏使用它?
- 9. 爲什麼Perl警告我使用僞哈希?
- 10. 我應該使用什麼作爲null的哈希碼?
- 11. 在哪裏可以使用分佈式哈希表代替BitTorrent?
- 12. 爲什麼GetHashCode很重要,我們可以在哪裏使用它?
- 13. 從哪裏開始 - 密碼哈希
- 14. 我們在哪裏使用JAAS
- 15. 爲什麼我們不用哈希表的項目存儲AVL樹?
- 16. 我在哪裏可以找到Windows 7 iso md5和sha1哈希?
- 17. Ruby使用什麼哈希函數?
- 18. 我爲什麼要在VB.net中使用哈希表作爲下拉列表
- 19. 爲什麼我們在這裏使用接口實現?
- 20. 爲什麼我們在這裏使用ephemeralSessionConfiguration?
- 21. 爲什麼我的兩個MD5哈希方法產生不同的哈希?
- 22. 爲什麼要清除我的哈希,也清除哈希數組?
- 23. 它爲什麼包含「使用哪裏」?
- 24. 當我在哪裏不工作時使用date_add,爲什麼?
- 25. 我誤解了哈希鹽是什麼?
- 26. 爲什麼Django會在我的網站上添加哈希?
- 27. 爲什麼base64 sha1/sha256哈希?
- 28. 爲什麼我們在jQuery中使用「({})」?
- 29. Perl中的哈希和哈希引用有什麼區別?
- 30. 雄辯 - 結合用戶::在哪裏與哈希::檢查
http://www.cs.auckland.ac.nz/~jmor159/PLDS210/hash_tables.html – 2011-02-25 13:29:26