靜態編程問題:假設有一組對象可以相互比較並進行排序。隨着對象的添加和當前最小的偶爾刪除,追蹤集合中最小元素的最有效方法是什麼?如何有效地追蹤集合中最小的元素?
回答
如果您需要隨機插入和刪除,最好的方法可能是一個排序的數組。插入和清除應該是O(log(n))。
@ Harpreet
這不是最優的。當一個對象被刪除時,erickson將不得不掃描整個集合來查找新的最小。
你想閱讀Binary search tree的。 MS有一個很好的site來啓動路徑。但是如果你想深入潛水,你可能想得到一本像Introduction to algorithms (Cormen, Leiserson, Rivest, Stein)這樣的書。
如果您需要隨機插入和移除, 最好的方法可能是排序的 數組。插入和清除應該是 O(log(n))。
是的,但是您需要重新對每個插入和每個刪除進行重新排序,並且(如您所述)是O(log(n))。
隨着由Harpreet提出的解決方案:
- 你有一個爲O(n)通過在開始尋找最小元件
- 插入件是O(1)之後(僅1相比需要對已知的最小元素)
- 刪除將是O(n),因爲您需要重新找到最小的元素(請記住Big O符號是最差的情況)。您還可以通過檢查以查看要刪除的元素是否是(已知的)最小元素來進行優化,如果不是,則不要執行任何重新檢查來查找最小元素。
所以,這取決於。其中一種算法對於刪除很少的插入大量用例會更好,但另一種算法總體上更加一致。我想我會默認使用Harpreet的機制,除非我知道最小的數字會經常被移除,因爲這暴露了算法中的一個弱點。
Harpreet:
的鑲入,這將是線性的,因爲你必須移動物品插入。
那不取決於集合的實現嗎?如果它的行爲像一個鏈表,插入將是O(1),而如果它像一個數組一樣實現,它將是線性的,如你所述。
取決於您需要容器支持哪些操作。A min-heap是最好的,如果你可能需要在任何給定的時間刪除最小元素,儘管幾個操作是不平凡的(在某些情況下分期log(n)時間)。但是,如果您只需要從前/後推/彈出,則可以使用mindeque來實現所有操作(包括findmin)的分攤恆定時間。你可以做a scholar.google.com search來了解更多關於這個結構。最近我和一個朋友合作,以達成一個更容易理解和實施的mindeque版本。如果這是你正在尋找的,我可以爲你發佈細節。
對於偶爾刪除Fibonacci Heap甚至比min-heap更快。插入是O(1),並且發現min也是O(1)。去除是O(日誌(n))的
- 1. 追蹤變化的集合?
- 2. 如何列表中的所有元素追加有效R中
- 3. 如何有效地找到列表中的n個最小元素?
- 4. 如何從有序集合中返回最近的元素?
- 5. 如何從矢量或集合中更有效地清除元素?
- 6. 如何在集合中高效地找到第k個最大元素,而集合可能隨時間變化?
- 7. 有效地Scala的集合
- 8. 作業:返回大於給定元素的集合中的最小元素BST
- 9. 如何有效地構建XML元素
- 10. 如何使用等效對象訪問集合中的元素?
- 11. 如何在新的追蹤中追蹤所有的Android版本?
- 12. 如何在Java中遞歸地生成N元素集合中的所有k元素子集
- 13. 如何有效地選擇R中具有最小值的行?
- 14. 以動態pythonic方式查找部分有序集合中的最小元素
- 15. 如何有效地追蹤大型用戶羣中登錄用戶的數量
- 16. 選擇組中的所有元素與集團的最小值
- 17. 追蹤Overlay元素的開放
- 18. 去除元素的最佳集合
- 19. 有效地跟蹤最新搜索
- 20. 如何追蹤asp.net頁面大小而不追蹤?
- 21. 如何在地圖中有效地找到一組集合的子集?
- 22. 如何在大集合中有效地計算所有短語?
- 23. 如何有效地跟蹤最大的用戶輸入值?
- 24. 如何從集合中刪除元素?
- 25. 如何有效地修改ViewModel中的集合?
- 26. 如何追蹤特定地點的元素移動和觸發功能?
- 27. 如何將一個集合劃分爲K個子集,這樣子集中元素的總和最小?
- 28. 追蹤應用程序運行時間的最有效方式
- 29. 樹中的最小元素
- 30. 的jqGrid - 如何追蹤本地操作
斐波那契堆比最小堆得更快,它有O(1)插入,而不是爲O(log(n))的 – martinus 2009-01-01 22:37:56
我從來沒有聽說過一個斐波那契堆 – jjnguy 2009-01-02 01:18:54