在二分查找中,我知道它的複雜性以log2(n)運行。搜索利用列表被排序的事實,所以我們可以假設數組中的每個項目都有一個'標記'(它的索引)作爲附加信息來減少運行時間。有什麼方法可以添加額外的「標籤」來進一步降低其複雜性?用不同的話來說,我們可以實現更高級別的組織結構嗎?二進制搜索O(log2(n))更改基址
回答
如果您的搜索算法基於比較,並且列表已排序,則log2(n)是下限。但是,有一些時空折衷算法或數據結構也可以用於搜索。最常見的是HashTable。
我不知道這是否適用於您的案例,但是如果您正在處理簡單的關聯邏輯(即,您沒有鍵/值區分,只有鍵),並且您的客戶已經擁有訪問密鑰,只是試圖找出一個元素是否屬於容器,然後有一個非常簡單和快速的解決方案,在尋找數據結構來完成這項工作時,往往沒有多少解決方案。
只需將一個或多個後向指針(或取決於語言的反向引用)存儲到密鑰內的容器即可。現在您不再搜索容器以查看密鑰是否屬於它。您可以搜索密鑰本身,在它的後端指示器中查看密鑰是否屬於容器。
即使您的密鑰一次不屬於太多容器,這通常也會超過最快的哈希表實現。如果它們一次只屬於一個容器,那麼只需查看背面指針是否指向您感興趣的容器即可進行快速定時檢查。
這是一個比容器更侵入式的解決方案這與您的關鍵表示完全分離,但如果您的需求符合標準,則難以超過設定邏輯的速度(查找某個屬性是否屬於某個集合,找到集合交集,聯合,差異):即,您正在處理簡單的關聯邏輯和你的密鑰一次不屬於太多這樣的聚集。
這種算法有沒有術語?我搜索了幾個你提到的關鍵詞,但是我對這個方法的工作原理還有點不確定,並且想了解更多。 –
調用算法/數據結構並不夠複雜,因爲它僅僅是一個返回指針或一個標誌,用於指示元素何時位於容器內部,以及是否返回指針。如果您還在鍵中存儲索引,則不僅可以找出某個元素屬於哪個容器,而且還可以找出O(1)中的哪個容器。 –
這就像你如何找出父節點與樹結構中的子節點相關聯?那麼,你可以使用前序/後序/後序樹遍歷來搜索整個樹,或者你可以交換空間的時間,並將一個返回指針存儲在子節點中的父節點。然後你就可以立即知道父節點給了哪個孩子。如果你做這些類型的「給孩子,那父母是什麼?」查詢很多,然後返回指針可以幫助大大超過不斷搜索數據結構。 –
- 1. 爲什麼O(N日誌N)構建二進制搜索樹?
- 2. 爲什麼我的二進制搜索需要額外的比較? log2(N)+1
- 3. 二進制搜索W/O庫方法
- 4. O(log n)中的二叉搜索樹?
- 5. 如何在O(n)時間內對雙鏈表進行二進制搜索?
- 6. 二進制搜索
- 7. 二進制搜索
- 8. 二進制搜索
- 9. 二進制搜索
- 10. 實現一個O(log n)的Foldable.elem二進制搜索樹在Haskell
- 11. 二進制搜索樹內的二進制搜索樹
- 12. 二進制搜索是/是二進制搜索貪婪算法?
- 13. 修改後的二進制搜索java
- 14. 修改的二進制搜索數組
- 15. 二進制搜索1/4修改
- 16. 二進制搜索很少修改
- 17. 時間複雜度 - O(n^2)到O(n log n)搜索
- 18. 圖形搜索O(log(N)(N + M)
- 19. 線性搜索或二進制搜索或二叉搜索樹
- 20. 二進制搜索樹,搜索方法
- 21. 二進制搜索樹搜索操作
- 22. 二進制搜索樹 - 搜索範圍
- 23. Swift二進制搜索樹搜索
- 24. 在O(log(n))複雜性中更改二進制堆元素的優先級
- 25. 蟒蛇二進制搜索和文件I/O
- 26. Big-O符號線性和二進制搜索
- 27. 二進制搜索範圍
- 28. Haskell - 二進制搜索樹
- 29. 二進制搜索樹Instantiaition
- 30. 二進制搜索功能
阿哈也許誤用了語言。我只是想說它使用它,我猜濫用是一個詞的侵略性。 –
要使用你自己的話,是的,有一種方法可以更巧妙地「標記」。你平均可以得到O(1)的表現。這就是所謂的哈希! – Abhay
您能否刪除'binary-tree'標籤?這不相關。 – Abhay