使用 heapq 实现一个优先级队列

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 很大的时候它们运速度也依旧很快。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值