回答
的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. Java中的优先级队列中断删除重复元素
- 9. Java优先级队列
- 10. 优先级队列,可比
- 11. 优先级队列C
- 12. 双重优先级队列
- 13. java优先级队列队列适应
- 14. 优先级队列VS队列
- 15. 如何从列表中删除具有相应优先级队列的元素?
- 16. 从队列的中间删除项目?
- 17. 优先级队列O(1)插入和删除
- 18. 删除优先级队列的尾部元素
- 19. C++,优先级队列,项目不排序
- 20. 新近度是次要优先级的优先级队列?
- 21. 优先级队列的优先级总是需要是整数?
- 22. 比较JAVA中的优先级队列
- 23. Java中的优先级队列
- 24. Hazelcast中的优先级阻止队列
- 25. PHP中的优先级队列
- 26. C中的优先级队列
- 27. stl中的优先级队列
- 28. Java链接列表优先级队列
- 29. 计算IBM MQ系列队列中每个优先级的项目
- 30. 带有跳过项目的Java优先级队列首先再处理
但是这会破坏堆不变? – 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