Java中Priority Queue類的remove()
函數的複雜性(大哦)是什麼?我無法在任何地方找到任何記錄,我認爲它是O(n),考慮到在刪除它之前必須先找到該元素,然後重新組合樹。但我看到其他人不同意並認爲它是O(logn)。有任何想法嗎?Priority Queue刪除複雜時間
回答
的測試remove複雜度爲O(N),因爲包含了複雜度爲O(N)(在Java中的優先級隊列類)
一種方式自己優先這可以由O(logN)的隊列實現是維護一個像HashMap一樣的輔助數據結構,它將映射從優先級隊列中的值維持到隊列中的位置。所以,在任何時候 - 你都會知道任何價值的指數位置。
請注意,此修改不會影響任何現有操作的運行時間 - 您只需要在heapify操作期間更新映射。
因此,如果我知道元素的索引位置,如何根據索引在優先級隊列API中刪除它? (在O(logN)時間) – novalain
@novalain不幸的是,Java API沒有提供通過索引訪問優先級隊列中的元素的方法,因此您必須使用自己的自制構建的優先級隊列實現。 –
爲什麼O(logN)從我們自己的實現中移除而不是O(1)?我確定我錯過了一些細節,但優先級隊列只是一個按高優先級排序的數據結構。如果它是使用鏈表實現的,並且我們知道索引,那麼我們不能只刪除該元素並將前一個節點連接到下一個節點? – user3125693
根據Oracle文檔: 「實現注意事項:此實現提供O(日誌(n))的時間入隊和dequeing方法(報價,民意調查顯示,刪除()和補充);線性時間remove(Object)和contains(Object)方法;以及檢索方法(peek,element和size)的常量時間。「
我認爲他的意思是remove(object)不是remove(),第一個是O(n),後一個是O(log n) –
remove()和poll()除了缺少元素語義外都是一樣的。刪除特定項目('remove(Object)')是'O(n)'。我認爲這個問題並不清楚,這也是一個有效的答案。 – TWiStErRob
的混亂實際上是由你的 「刪除」 功能引起的。在java中,有兩個刪除功能。
remove() - >這是刪除頭/根,它需要O(logN)時間。
remove(Object o) - >這是刪除任意對象。找到這個對象需要O(N)時間,並且移除它需要O(logN)時間。
- 1. Priority Queue通用
- 2. Priority Queue Juggling
- 3. Priority queue and deque
- 4. python Priority Queue實現
- 5. 計算時間和空間複雜度來刪除重複項
- 6. Priority Queue沒有名爲top()的成員?
- 7. C++ Floating-point van Emde Boas(vEB)Priority Queue
- 8. rabbitmq-priority-queue插件安裝問題
- 9. 重複數據刪除算法的時間複雜度
- 10. 加載聯繫人時刪除時間複雜度
- 11. 時間複雜?
- 12. 時間複雜
- 13. 雙向鏈表中節點刪除的時間複雜度
- 14. 刪除無效括號時間複雜度
- 15. 刪除無效圓括號 - Leetcode時間複雜度
- 16. SQL:複雜的刪除
- 17. hashmap刪除複雜性
- 18. 複雜SSIS刪除方案
- 19. 複雜刪除SQL語句
- 20. 複雜的刪除查詢
- 21. 時間複雜度
- 22. 時間複雜度
- 23. 時間複雜度
- 24. 時間複雜度
- 25. 時間和空間複雜
- 26. 時間複雜度和空間複雜度,如何計算空間複雜度
- 27. 時間複雜度,同時刪除最後一個元素從ArrayList和LinkedList
- 28. 時間和空間複雜的語言複雜性
- 29. 計算函數的空間複雜度和時間複雜度
- 30. 確定時間複雜
您是否考慮閱讀Javadoc? [「這個實現提供了enqueing和dequeing方法(offer,poll,remove()和add)的O(log(n))時間」](http://docs.oracle.com/javase/6/docs/api /java/util/PriorityQueue.html)。 – EJP
是的,我做到了。在下一行中,它表示「刪除(對象)和包含(對象)方法的線性時間;和檢索方法(peek,element和size)的持續時間「,這是我感到困惑的地方。我想我現在明白了。 – samturner