回答
的heapq
模塊採用標準的Python列表作爲底層的數據結構,所以你可以在此之後只使用標準list
方法remove()
和heapify()
一次。請注意,這將需要線性時間。
# Create example data and heapify
a = range(10)
a.reverse()
heapq.heapify(a)
print a
# remove an element and heapify again
a.remove(5)
heapq.heapify(a)
print a
你可以提高使用無證功能heapify._siftup()
再次heapifying的表現,但整個過程仍然會因爲list.remove()
O(n)是O(N)。
有一個數據結構稱爲treap這是一個優先級隊列和二叉樹的組合。 (樹堆)。它允許日誌搜索,這可能會幫助你。
該日誌(N)函數的工作對我來說:
def heapq_remove(heap, index):
"""Remove item from heap"""
# Move slot to be removed to top of heap
while index > 0:
up = (index + 1)/2 - 1
heap[index] = heap[up]
index = up
# Remove top of heap and restore heap property
heapq.heappop(heap)
如果你知道你要刪除的項目的位置,你可以做以下:現在
a[k] = a.pop()
heapq.heapify(a)
第一步是O(1)時間,並且第二可通過使用未記錄的數據進行O(日誌(N))。當然,如果你還沒有找到k,它仍然是O(N)。
您可以使用Python的對分模塊在O(log(N))時間中查找k,這將使得整個解決方案O(log(N))。 – javawizard 2012-07-23 00:30:45
@javawizard對不起,但我沒有得到你,我怎麼才能找到堆中的元素的位置/索引?我正在考慮維護字典,但是每次插入堆時,我都必須修改該字典。 – Naman 2014-09-13 18:54:39
小心,a [k] = a.pop()不適用於列表中的最後一個元素 – gizzmole 2017-11-27 15:39:57
- 1. STL優先級隊列 - 刪除項目
- 2. 基於鏈接列表從優先級隊列中刪除項目
- 3. 具有動態項目優先級的優先級隊列
- 4. 從優先隊列中刪除元素
- 5. 優先級隊列中的優先級
- 6. 優先級最高的優先隊列項目
- 7. 常量大小優先級隊列 - 先插入或先刪除?
- 8. 優先級隊列
- 9. Java中的優先級隊列中斷刪除重複元素
- 10. 從陣列到優先級隊列
- 11. Java優先級隊列
- 12. PHP Sendmail隊列優先級
- 13. 雙重優先級隊列
- 14. Objective-c優先級隊列
- 15. 優先級隊列,可比
- 16. Amazon SQS優先級隊列
- 17. 關鍵 - 優先級隊列
- 18. 的Java:優先級隊列
- 19. 優先級隊列C
- 20. 樹和優先級隊列
- 21. 優先級隊列在python
- 22. java優先級隊列隊列適應
- 23. 優先級隊列VS隊列
- 24. 如何從列表中刪除具有相應優先級隊列的元素?
- 25. 從隊列的中間刪除項目?
- 26. 刪除優先級隊列的尾部元素
- 27. 優先級隊列O(1)插入和刪除
- 28. 如何將java優先級隊列轉換爲C++優先級隊列?
- 29. C++,優先級隊列,項目不排序
- 30. 優先級隊列的優先級總是需要是整數?
但是這會破壞堆不變? – Will 2011-03-30 10:17:32
@ will:heapify()恢復不變量。 – Macke 2011-03-30 10:19:21
@Will,Macke:對不起,我很困惑。我首先發布了一個沒有提到你必須再次調用'heapify()'的版本,但立即糾正了它。 – 2011-03-30 10:29:36