位置: 编程技术 - 正文

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)

  • 税控盘维护费会计分录怎么写
  • 按适用税率计税销售额和按简易办法计税销售额
  • 增值税普通发票有什么用
  • 契税为什么计入成本
  • 开票时显示没有原票抄报信息
  • 企业所得税弥补亏损年限
  • 随意变更会计处理方法违背了
  • 已经确认收入的售出商品发生销售退回时
  • 税金及附加怎么计提
  • 公司结业清算后多久注销
  • 工会经费计入应付职工薪酬
  • 出售无形资产属于让渡资产使用权吗
  • 营改增的案例分析
  • 税收分类编码如何填写
  • 航天发票上传不成功怎么手动上传
  • 增值税品目有哪些
  • 转出未交增值税在借方是什么意思
  • 利润表本月金额指的是什么
  • 企业筹建期间可以自己发农民工工资么
  • 收到外币货款账务处理
  • 外出经营地预交税金归主管税务所管吗
  • win11更新失败怎么办
  • 电信apn接入点设置+最快
  • windows10 怎么样
  • 产品入库是什么
  • 预付维修费计入入账价值吗
  • 升级鸿蒙系统会解除限制充电60
  • php模板引擎语法
  • 电脑的时间不准了怎么调
  • 企业出售产品前,预收客户一笔货款
  • 贴现息等于什么
  • 员工购买住房公积金申请
  • 商业汇票转让后,能否追索前手
  • 支付航天信息服务费怎么入账
  • 科技推广和应用服务业行业
  • devtools安装mac
  • vue2路由跳转页面不刷新问题
  • 申请专利费用计入哪个科目
  • ln s命令
  • 微信php开发教程
  • 应收利息罚息什么意思
  • 企业销售旧车增值税处理
  • 上季度的发票开出去了可以作废吗
  • 借受托代销商品贷受托代销商品款
  • 销售货物未收到货款的会计分录怎么写
  • 企业工会经费计提比例
  • mac卸载软件在哪里彻底卸载?
  • 建筑企业分项目信息采集表怎么填
  • 财务软件期末处理
  • 所得税申报表营业成本包括哪些
  • 货物运输发票的开票要求
  • 员工垫付的费用没有发票,放在工资里可以吗
  • 其他未列明信息技术服务业
  • 销售给回扣的话术
  • 出口退税暂不抵税怎么办
  • 印花税的计算公式应纳税所得额包含增值税吗
  • 应交税费应交增值税已交税金怎么用
  • 小规模一季度不超过30万是不含税吗
  • 建筑企业人工费计入什么科目
  • 商品流通企业流程
  • 采用账龄分析法计提坏账准备
  • CentOS6.7 mysql5.6.33修改数据文件位置的方法
  • 同一个sql语句 连接两个数据库服务器
  • ghost重装步骤
  • xp系统进程
  • win8电脑设置打不开怎么办
  • win10系统如何删除用户账户
  • perl ne
  • cocos2dx怎么用
  • listview安卓
  • android images
  • jquery常用操作
  • python日志管理系统
  • unity gpu优化
  • python快捷键大全
  • 税务三方协议多久生效
  • 精准扶贫就业补贴怎么领?
  • 广西城建投资集团官网
  • 地税网上申报密码
  • 珠海市高新区国土局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设