位置: 编程技术 - 正文

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)

  • 旅游住宿有什么问题
  • 税务机关是什么
  • 房地产企业成本包括哪些
  • 商誉在资产负债表中如何体现
  • 小规模首次申请发票张数
  • 营业外支出影响损益吗
  • 领用本企业生产的水泥用于在建工程
  • 计提个人部分保险
  • 公司购买车库是什么费用
  • 集团公司及子公司员工安排工作
  • 企业租赁集体土地种植经济林如何补偿
  • 实际收到股票股利的分录
  • 其他应收款对方科目是啥
  • 年终奖金在年度内扣税吗
  • 返利红字发票怎么做账
  • 房屋租赁发票可以抵扣增值税吗
  • 美金公户打入个人账户
  • 3个点的发票有哪些
  • 特许权使用费代扣代缴增值税
  • 人力资源顾问公司有什么岗位
  • 公司以银行存款名义为员工垫付医疗费分录怎么写
  • 开红字冲红发票 下个月怎么申报
  • 资产负债表中资产总计和负债所有者权益不平等
  • 每月免税10万是什么意思
  • 异地预缴企业所得税会计分录
  • 专项维修基金所得税可税前扣除吗?
  • 合营企业之间为什么不构成关联方
  • 股东以无形资产投资,撤资时怎么算
  • 长期待摊费用科目还用吗
  • 工程施工预付账款会计分录
  • 以固定资产换入无形资产
  • 应付职工薪酬怎么做记账凭证
  • 下岗职工生活费最多发多少个月
  • 纳税人提供应税服务
  • 增值税缓交政策
  • Web渗透测试新手实操详解
  • 填报的资产总额在季初和季末存在差异是什么意思
  • tune a video:one-shot tuning of image diffusion models for text-to-video generation
  • php入门实例
  • python 如何
  • mysql列表
  • 预缴税款从哪里查
  • 小规模纳税人财务报表是按季还是按月申报
  • wordpress site
  • 股权出质有时间限制吗
  • 织梦标签理解
  • 帝国cms相关文章调用
  • 企业收利息会计科目
  • ip地址跳转域名
  • 同时运行多个MySQL服务器的方法
  • 服务器配置mysql
  • 给钱给员工自行交保险
  • 哪些合同必须签订书面合同
  • 固定资产没有折旧完要转走会计科目
  • 月底库存现金可以有余额吗
  • 当月已经认证的发票可以取消认证吗
  • 体检入账的原始凭证是
  • 增资扩股对原股东的影响
  • 删除数据库重复
  • 监控系统文件
  • windows延缓写入失败怎么修复
  • 酷炫技术:使用ssh登录管理windows系统
  • centos的特点
  • ubuntu无线网卡驱动离线安装
  • win8系统怎么设置开机密码
  • linux修改文件权限
  • win7 64纯净版网页打开出现乱码该怎么办 解决方法介绍
  • win10下itunes
  • js实现用户登录
  • 深入分析南水北调工程面临的新形势心得体会
  • div+css布局的步骤
  • xcode 导入sdk
  • centos7如何分区
  • jquery.min.js源代码
  • android的图片应该放到哪一个目录下面?
  • vue实现淘宝布局
  • jQuery实现Select左右复制移动内容
  • javascript中的对象用于
  • 陕西国家税务总局官网登录入口
  • 关于抓落实的诗句
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设