import heapq
from collections import namedtuple
class PriorityQueue:
def __init__(self):
self._queue = []
self._index = 0
def push(self, item, priority):
heapq.heappush(self._queue, (-priority, self._index, item))
self._index += 1
def pop(self):
return heapq.heappop(self._queue)
Item = namedtuple('Item', ('name',))
pq = PriorityQueue()
pq.push(Item(name='A'), 5)
pq.push(Item(name='B'), 4)
pq.push(Item(name='C'), 6)
pq.push(Item(name='D'), 5)
print(pq.pop())
print(pq.pop())
print(pq.pop())
print(pq.pop())
解释如下:
1. heapq.heappush函数把一个元组数据插入到了一个数组中
2. heapq.heappop函数总是返回最小的元素
3. 我们使用元组(-priority, self._index, item)的原因是:为了更加方便的做比较,如果有相同优先级的priority,则按插入顺序index进行比较,因为index永远不会重复(一定会比较出结果),所以即使后面的item为不可以比较的元素也无妨。
由于 push 和 pop 操作时间复杂度为 O(log N),其中 N 是堆的大小,因此就算是 N 很大的时候它们运速度也依旧很快。