答案 0 :(得分:13)
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()
再次提高堆化的性能,但由于list.remove()
为O(n),整个过程仍为O(n)。
答案 1 :(得分:6)
如果您知道要删除的项目的位置,则可以执行以下操作:
a[k] = a.pop()
heapq.heapify(a)
第一步现在是O(1)时间,第二步可以通过使用未记录的数据制作O(log(N))。当然,如果你还没有找到k,它仍然是O(N)。
答案 2 :(得分:3)
这个日志(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)
答案 3 :(得分:2)
有一个名为treap的数据结构,它是一个优先级队列和二叉树组合在一起。 (树堆)。它允许log-n搜索,这可能对您有所帮助。