位置: 编程技术 - 正文

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)

  • 小规模缴纳增值税
  • 劳务费发票可以抵扣进项税吗
  • 小微企业减免增值税申报表填写
  • 公司工资0申报
  • 收入与成本不配合
  • 简易计税的进项可以抵扣吗
  • 账簿登记的基本要求
  • 学生勤工俭学收入交个人所得税吗
  • 冲减往年管理费用
  • 现金比率计算公式含义
  • 事业单位大型修缮会计分录
  • 企业股东投资
  • 废品计入哪个科目
  • 应交所得税的计算例题
  • 有2处收入要交个税,自己如何去交个税
  • 公司活动服装费会计分录
  • 招大学生做兼职的网站
  • 一个月的销售额
  • 固定资产报废需要在固定资产系统中
  • 公司股权转让协议标准范本
  • 收到购货方退回的发票联和抵扣联如何处理?
  • 免税农产品抵扣政策
  • 项目单位自筹资金
  • 主营业务成本如何算
  • mac上读取ntfs
  • 公司出售已经提完折旧的机器
  • 预收外汇如何结汇
  • 转账支票出账日期
  • CI(Codeigniter)的Setting增强配置类实例
  • 谈谈社会公德普通话三分钟
  • java webflux
  • nn.lstm输出
  • 蓝桥杯官网报名2020
  • tar -xvf命令
  • 进口固定资产支付的关税
  • 错账的类型及对应的更正方法
  • 常见的数据库管理系统有
  • mysql配置文件my.ini如何创建
  • 公积金个人缴纳和公司缴纳比例
  • 个人社保应不应该缴纳
  • 代理运费增值税税率
  • 风险纳税人去税务局去报税可以吗
  • 付款申请单如何转填记账凭证
  • 长期借款的账务处理会计分录
  • 银行理财产品算银行存款吗
  • 残保金是公司交还是员工交
  • 分公司设立条件怎么写
  • 会计行政法规包括哪些条例?具体说明?
  • sqlserver 获取字符位置
  • mysql索引的使用和原理
  • win10每次开机都假死机
  • imac固态
  • 苹果系统数据怎么清掉
  • cfg是什么格式,怎么打开
  • 7款应用最广泛的游戏
  • 苹果电脑Mac系统版本所对应的数字
  • win10各个版本的桌面
  • win7 64位旗舰版电脑鼠标如何才能设置成左手操作?设置鼠标为左手操作的方法
  • win8系统怎样
  • opengl learn
  • jquery滚动到底部
  • 各种扩展名的含义
  • python pickle 保存
  • python的基本数值类型
  • JavaScript获取网址之后跳转
  • [android那些事] linux 下android源码编译(国内被墙方案)
  • Android platform build guide for Exynos-4412(odroid -X/X2/U2/U3/Q2/Q)
  • android应用开发基础课后答案
  • python socks
  • JavaScript程序设计形考任务第一次任务
  • 浙江税务客服咨询电话
  • 晋江劳动局地址
  • 税局如何查账
  • 济南市中区税务局办税大厅
  • 房产税怎么计提和缴纳分录
  • 查询如何查询
  • 重庆外经证网上报验流程及时间
  • 请问报考国家税务局难吗
  • 临汾的公司需要交社保吗
  • 企业的捐赠支出在哪里能看到
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设