Python 从优先级队列中删除项目

Python 从优先级队列中删除项目,python,data-structures,Python,Data Structures,在Python中,模块提供了一个优先级队列 它有插入和弹出项目的方法 如何从队列中删除插入的优先级不是最低的项目 (也欢迎使用其他替代集合执行此操作的替代方法)模块使用标准Python列表作为基础数据结构,因此在此之后,您只需再次使用标准的list方法remove()和heapify()。请注意,这将需要线性时间 # Create example data and heapify a = range(10) a.reverse() heapq.heapify(a) print a # remo

在Python中,模块提供了一个优先级队列

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

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


(也欢迎使用其他替代集合执行此操作的替代方法)

模块使用标准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.\u siftup()
,您可以再次提高heapify的性能,但整个过程仍然是O(n),因为
list.remove()
是O(n)。

有一个名为a的数据结构,它是优先级队列和二叉树的组合。(树堆)。它允许进行log-n搜索,这可能会对您有所帮助

有一个……)

此日志(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(log(N))。当然,如果您还没有k,那么仍然需要O(N)才能找到它。

但这会破坏堆不变量吗?@will:heapify()还原不变量。@will,Macke:很抱歉造成混淆。我首先发布了一个版本,其中没有提到您必须再次调用
heapify()
,但立即更正了它。您可以使用Python的对分模块在O(log(N))时间内找到k,这将使整个解决方案成为O(log(N))。@javawizard抱歉,但我没有告诉您如何在堆中找到我的元素的位置/索引?我本来想维护dict,但每次我在堆中插入dict时,我都必须修改该dict。小心,a[k]=a.pop()对列表中的最后一个元素不起作用对不起,我要恢复它,但是@javawizard,这行得通吗?因为heapq没有按排序顺序维护列表,所以对分不会为k找到合适的索引,是吗?