位置: 编程技术 - 正文

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)

  • 财务报表与分析课后答案
  • 租车开发票属于什么类
  • 补缴工会经费后所得税还要调整吗
  • 无形资产计税基础怎么算
  • 最近的火车票代售点
  • 固定资产用于集体福利也算经营管理需要吗
  • 金税系统维护费可以全额抵扣吗
  • 委托加工物资两种情况例题
  • 资产的企业所得税怎么算
  • 公司购入货架如何做账
  • 房地产开发成本费用明细表
  • 补偿款开具发票
  • 一般纳税人可以简易计税的有哪些
  • 发票不能开怎么回事
  • 收到的劳务费发票进什么科目
  • 制造费用包括劳动保护费吗
  • 年末会计账上应该注意哪些
  • 主营业务收入写不写明细
  • 两处拿工资的缴税问题
  • 房地产企业预缴增值税什么时候结转
  • 餐饮发票免税能报销吗
  • 个人投资到企业的资金入什么科目
  • 分期收款方式怎么算消费税
  • 企业结算备付金怎么做账
  • 公司面临清算,外包企业的员工怎么处理?
  • 在win7中,为什么打开盘符在新窗口中出现?
  • 开具成品油发票规格型号有哪些要求
  • 哪些金融资产的股票会涨
  • 完美解决怠速抖动加油就平稳
  • PHP:mb_strtolower()的用法_mbstring函数
  • 电脑重装系统怎么激活
  • 系统之家哪个系统比较好用
  • newdot.exe - newdot是什么进程 有什么用
  • 进口应税消费品会计分录
  • 单位代缴住房公积金分录
  • 农产品进项税额转出怎么算
  • 向投资者分配现金股利 为什么会导致所有者权益减少?
  • 专项储备计提和使用
  • 投标报名费怎么定
  • php遍历结果集
  • php 银行卡支付
  • 收到银行的贷款怎么入账
  • 模具固定资产如何核算
  • 企业销售旧固定资产税票开票
  • 进口商品会计分录怎么写
  • 个人社保进费用,还要报个税么
  • wordpress怎么降级
  • python中@是什么意思
  • 使用SqlServer CTE递归查询处理树、图和层次结构
  • 不能防止sql注入
  • 土地交易服务费由哪个部门收取
  • 增值税计提多了已经跨年度怎么办
  • 会计凭证,报告怎么做
  • Mysql优化sql方案
  • SQL Server COALESCE函数详解及实例
  • win10预览版21277
  • win2008r2下载
  • XP系统升级WIN7系统
  • 注册表修改的方法有哪几种
  • linux系统批量替换内容
  • win8如何删除登录密码
  • win10系统开机密码设置方法
  • centos8查看cpu温度
  • kernel headers not found for target kernel
  • windows10的操作中心
  • c#+unity3d
  • GLWallpaperService分析一
  • perl 读文件
  • jquery 插件写法
  • linux中的shell命令
  • xml能写网页吗
  • nodejs require
  • 简单阐述javascript的主要作用
  • shell脚本windows
  • mysql数据表复制
  • android基础入门教程
  • 税务规范性文件制定管理办法
  • 国税局黑龙江省
  • 江苏几个地级市几个县级市
  • 作废的发票验旧之后怎么领取新发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设