从优先级队列中删除项目

时间:2011-03-30 10:11:31

标签: python data-structures

在Python中,heapq模块提供优先级队列。

它有插入和弹出项目的方法。

如何从队列中删除已插入但不是最低优先级的项目?

(也欢迎使用替代其他收藏品的替代食谱)

4 个答案:

答案 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搜索,这可能对您有所帮助。

Python treap implementation on PyPi ..;)