Python数据结构和算法---实现优先级队列

什么是优先队列

优先队列是队列的扩展,具有以下属性:

  • 每个元素都有一个优先级。
  • 元素具有与它们关联的优先级,并且具有最高优先级的元素始终在队列的前面。
  • 如果两个元素具有相同的优先级,则它们按照它们在队列中出现的顺序进行排序。
  • 优先队列的插入和删除操作具有O(log n)时间复杂度。

问题

我们想要实现一个队列,它能够以给定的优先级来对元素排序,且每次 pop 操作时都会返回优先级最高的那个元素。

解决方法

使用heapq模块进行解决

下面的这个例子是实现优先级队列

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]

讨论

heapq是一个堆队列算法,它提供了堆的基本操作,如插入、弹出最小元素等。

这个程序定义了一个PriorityQueue类,它包含两个实例变量:_queue和_index。_queue是一个列表,用于存储元素和它们的优先级,而_index是一个计数器,用于为每个元素分配唯一的索引。这个计数器是在每次插入元素时递增的。

该程序实现了两个方法:push()和pop()。push()方法用于将元素插入队列中,它接受两个参数:item表示要插入的元素,priority表示该元素的优先级。在插入元素时,程序将元素、它的优先级和索引作为一个三元组添加到队列中。***为了实现优先级队列的逻辑,程序将优先级取负数,这样优先级越高的元素会被放在堆的顶部。***最后,程序递增索引以确保每个元素都有不同的优先级和顺序。

pop()方法用于弹出队列中的最高优先级元素,并返回该元素。在调用heapq.heappop()函数时,程序会从队列中弹出具有最高优先级的元素。这个元素是三元组,因此程序返回元组的最后一个元素,即原始的item值。

这个程序是一个简单但有效的优先队列实现,它使用了Python标准库中的堆算法。我们可以使用这个优先队列来实现各种算法,例如Dijkstra算法、A*算法等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈易叁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值