Python中如何实现带权重的队列

2023-04-11 00:00:00 队列 权重 如何实现

在Python中,我们可以使用 heapq 库中的 heap 数据结构来实现带权重的队列。heapq 库提供了一组通用的堆算法,它们可以被用来在 Python 中实现优先队列。

下面是一个简单的带权重的队列实现,其中字符串 "pidancode.com" 和 "皮蛋编程" 作为了范例:

import heapq

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)[-1]

pq = PriorityQueue()
pq.push("pidancode.com", 1)
pq.push("皮蛋编程", 2)
pq.push("Python", 0)
print(pq.pop())  # Python
print(pq.pop())  # pidancode.com
print(pq.pop())  # 皮蛋编程

在以上代码中,我们定义了一个 PriorityQueue 类,它有两个主要的方法:push() 和 pop()。

push() 方法接收两个参数,一个是要添加的元素,另一个是该元素的优先级。该方法首先将元素与其优先级的相反数和一个自增的索引值组成的元组添加到堆队列中。由于 Python 的 heapq 模块默认是按元组的顺序比较,因此这里用负数来表示优先级,以便让较小的数字对应更高的优先级。

pop() 方法从队列中删除并返回具有最高优先级的元素。由于元素已经按优先级排序,我们只需弹出堆的第一个元素即可。我们再用 [-1] 来取出第三个元素(也就是原来的 item),因为前两个元素是优先级和索引,我们不关心它们。

最后,我们创建了一个 PriorityQueue 对象,并向其添加三个元素。我们用 print() 函数打印了每次调用 pop() 方法的结果,它们的顺序与它们的优先级相匹配。

相关文章