位置: 编程技术 - 正文

Python实现优先级队列结构的方法详解(python优先级顺序)

编辑:rootadmin

推荐整理分享Python实现优先级队列结构的方法详解(python优先级顺序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python and or not优先级,优先级排序python,python中%的优先级,python and or not优先级,python and or not优先级,python and or not优先级,python中的优先级,python优先级运算符,内容如对您有帮助,希望把文章链接给更多的朋友!

最简单的实现一个队列至少满足2个方法,put和get.借助最小堆来实现.这里按"值越大优先级越高"的顺序.

使用heapq模块来实现下面的类利用 heapq 模块实现了一个简单的优先级队列:

下面是它的使用方式:

仔细观察可以发现,第一个 pop() 操作返回优先级最高的元素。 另外注意到如果两个有着相同优先级的元素( foo 和 grok ),pop操作按照它们被插入到队列的顺序返回的。

函数 heapq.heappush() 和 heapq.heappop() 分别在队列 _queue 上插入和删除第一个元素, 并且队列_queue保证第一个元素拥有最小优先级(1.4节已经讨论过这个问题)。 heappop() 函数总是返回”最小的”的元素,这就是保证队列pop操作返回正确元素的关键。 另外,由于push和pop操作时间复杂度为O(log N),其中N是堆的大小,因此就算是N很大的时候它们运行速度也依旧很快。

在上面代码中,队列包含了一个 (-priority, index, item) 的元组。 优先级为负数的目的是使得元素按照优先级从高到低排序。 这个跟普通的按优先级从低到高排序的堆排序恰巧相反。

index 变量的作用是保证同等优先级元素的正确排序。 通过保存一个不断增加的 index 下标变量,可以确保元素按照它们插入的顺序排序。 而且, index 变量也在相同优先级元素比较的时候起到重要作用。

为了阐明这些,先假定Item实例是不支持排序的:

如果你使用元组 (priority, item) ,只要两个元素的优先级不同就能比较。 但是如果两个元素优先级一样的话,那么比较操作就会跟之前一样出错:

Python实现优先级队列结构的方法详解(python优先级顺序)

通过引入另外的 index 变量组成三元组 (priority, index, item) ,就能很好的避免上面的错误, 因为不可能有两个元素有相同的 index 值。Python在做元组比较时候,如果前面的比较以及可以确定结果了, 后面的比较操作就不会发生了:

如果你想在多个线程中使用同一个队列,那么你需要增加适当的锁和信号量机制。 可以查看.3小节的例子演示是怎样做的。

深入思考函数 heapq.heappush() 和 heapq.heappop() 分别在队列 _queue 上插入和删除第一个元素, 并且队列_queue保证第一个元素拥有最小优先级(1.4节已经讨论过这个问题)。 heappop() 函数总是返回”最小的”的元素,这就是保证队列pop操作返回正确元素的关键。 另外,由于push和pop操作时间复杂度为O(log N),其中N是堆的大小,因此就算是N很大的时候它们运行速度也依旧很快。

在上面代码中,队列包含了一个 (-priority, index, item) 的元组。 优先级为负数的目的是使得元素按照优先级从高到低排序。 这个跟普通的按优先级从低到高排序的堆排序恰巧相反。

index 变量的作用是保证同等优先级元素的正确排序。 通过保存一个不断增加的 index 下标变量,可以确保元素按照它们插入的顺序排序。 而且, index 变量也在相同优先级元素比较的时候起到重要作用。

为了阐明这些,先假定Item实例是不支持排序的:

如果你使用元组 (priority, item) ,只要两个元素的优先级不同就能比较。 但是如果两个元素优先级一样的话,那么比较操作就会跟之前一样出错:

通过引入另外的 index 变量组成三元组 (priority, index, item) ,就能很好的避免上面的错误, 因为不可能有两个元素有相同的 index 值。Python在做元组比较时候,如果前面的比较以及可以确定结果了, 后面的比较操作就不会发生了:

如果你想在多个线程中使用同一个队列,那么你需要增加适当的锁和信号量机制。 可以查看.3小节的例子演示是怎样做的。

heapq 模块的官方文档有更详细的例子程序以及对于堆理论及其实现的详细说明。

详解Python中的__new__、__init__、__call__三个特殊方法 __new__:对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)__init__:对象的初始化,是一个实例方法

实例解析Python中的__new__特殊方法 __new__方法是什么?如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参数则是生产所需原料,__init__()方法会按

Python的Django框架中使用SQLAlchemy操作数据库的教程 零、SQLAlchemy是什么?SQLAlchemy的官网上写着它的介绍文字:SQLAlchemyisthePythonSQLtoolkitandObjectRelationalMapperthatgivesapplicationdevelopersthefullpowerandflexibilityofSQL.SQLAlch

标签: python优先级顺序

本文链接地址:https://www.jiuchutong.com/biancheng/386940.html 转载请保留说明!

上一篇:KMP算法精解及其Python版的代码示例(kmp算法理解)

下一篇:详解Python中的__new__、__init__、__call__三个特殊方法(python:\n)

  • 税收分类编码如果选择大类开票会怎样
  • 生产企业出口自产的小汽车
  • 金税四期对企业和个人的影响
  • 增值税纳税期限1日是什么意思
  • 增值税专票开户行
  • 买烟草可以开发票吗
  • 装修工程一切险
  • 增值税发票9个点和13个点区别
  • 机器设备如何计提折旧
  • 递延所得税如何申报
  • 应付未付的职工工资属于什么会计科目
  • 境外派遣员工境外所得税是什么时候申报?
  • 如何查询对方是不是老赖
  • 企业股权溢价转让会计分录
  • 核定征收的企业需要做账吗
  • 房地产企业各个阶段所涉及的税种
  • 种子销售公司
  • 股东垫支开办费
  • 企业可以采用在产品按固定成本计算法的有
  • 家具螺丝螺母一般在哪里卖
  • win11怎么关闭进程
  • 企业亏损可以不缴纳公积金吗
  • 鸿蒙系统怎么隐藏状态栏
  • win10开发工具在哪
  • linux系统中安装web服务
  • 事业单位需要交企业所得税吗
  • wlan和蜂窝版的区别
  • 小规模纳税人进项可以抵扣吗
  • 增值税怎样计算
  • 银装素裹的意思和造句
  • 家里装饰镜太多了怎么化解
  • php rest api
  • 基于强化学习的智能机器人路径规划算法研究(附代码)
  • 个体经营所得税申报表a
  • php查询数据是否存在
  • php注释有几种?如何表示?
  • 服务什么行业
  • phpcms是什么意思
  • css媒体查询不起作用
  • 车费增值税税率
  • 母公司吸收合并全资子公司
  • 工资是当月计提当月发放还是当月计提下月发放
  • 高新技术企业认定中介机构
  • 企业固定资产纳税
  • 一般纳税人外地预缴税率
  • 母子公司之间无偿划转固定资产
  • 6月收到4月的单子怎么办
  • 公司买车车辆购置税怎么交钱
  • 担保贷款借款人死亡
  • 在保险中,保险利益的载体是
  • 同一个法人的两家企业可以进行互相开票吗
  • 申报高新技术企业专利有什么要求
  • 查账征收的个体户怎么交个税
  • 销售红酒的公司
  • 购入旧的固定资产还能一次性抵扣吗
  • 会计利润是利润加暂时性差异吗为什么
  • sql数据采集
  • 快启动U盘怎么进去
  • WINDOWS SERVER 2008开启桌面主题具体步骤
  • ubuntul
  • centos6开机启动服务
  • win7更改win10系统要怎么更改
  • 五个常用的说明方法
  • CentOS 6.x 到 CentOS 7 的升级过程
  • Slackware Linux init 进程
  • linux定时任务怎么立刻生效
  • css样式表可以兼容所有浏览器吗
  • 动态规划之矩阵连乘
  • pythonista pygame
  • 简述python的垃圾回收机制
  • python如何用
  • jquery设置单选框
  • opencv识别结果输出
  • android图片适配方法
  • 青岛市税务局内设机构
  • 给个人佣金怎么避税
  • 成都高新区税务局办税服务厅电话
  • 一个人可以申请
  • 江苏徐州如何开无犯罪记录证明
  • 个人转让住宅需要缴纳什么税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设