位置: 编程技术 - 正文

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)

  • 企业收取的租金应当计入
  • 企业借出去的钱收不回来
  • 什么是销项税额抵减
  • 未确认融资费用怎么算
  • 折旧费属于什么科目
  • 收到天使投资如何做账
  • 旅游发票可以抵扣吗
  • 发票税号不对还能报销吗
  • 中介费要求开发票中介公司不开
  • 房东收到房租转让费会计处理
  • 个人购买商业保险怎么抵扣个税
  • 销售大型设备的税率
  • 企业取得该项资产时实际发生的支出
  • 应收票据的会计分录例题
  • 收款未发货需要纳税吗
  • 注册资本未到位转让股权
  • 价内税和价外税区别
  • 携税宝可以全额抵扣吗
  • 资产负债表和利润表的利润不一致
  • 企业定期存款是什么账户类型
  • 外挂项目跨年结转分录怎么做?
  • 买一赠一使用规则
  • 4s店帮买保险后会哪些资料要给我的
  • windows 11密钥
  • 多交的增值税怎么申报
  • 在幻灯片中导入视频文件后视频文件时被几个圆点框选
  • 公司网银付款和付款区别
  • 保险赔款确认函
  • 小规模减免的增值税怎么记账
  • linux文件夹怎么删除
  • 雨林木风win10安装失败
  • 收到折扣负数发票如何入账
  • PHP:oci_free_statement()的用法_Oracle函数
  • thinkphp3.2.3缓存漏洞
  • 质量事故责任书
  • 摊余成本计量的金融资产若溢价购买小于
  • laravel实现登录注册
  • jquery制作轮播切换效果
  • 前端vue3
  • stm32f103教程
  • 商业企业常用会计科目
  • 收到借款时 会计科目怎么做
  • 事业单位一级项目和二级项目区别
  • 开票软件的证书口令是多少
  • 分公司以总公司名义
  • php5.6.和7.2区别
  • 电子税务局发票作废流程
  • 不能从销项税额中抵扣的进项税额为A购进货物运费准予
  • 固定资产清理的账务处理
  • 一般纳税人技术服务费几个点
  • sql 集合运算符
  • 出口货物的进项税
  • 个人所得税能说明什么
  • 应付职工薪酬怎么冲平
  • 暂估入账的固定资产
  • 车辆按揭贷款需要什么
  • 公司的钱转入余额账户
  • 个人账户转公司账户附言写什么
  • 贷款转入账号
  • 法人存入公户的钱摘要
  • 公司员工的电话费可以做费用吗
  • win10有三个系统
  • windows2003 IIS6.0 asp配置技巧
  • windows下打开ie提示由于该计算机受到限制,本次操作已被取消
  • win8 开机
  • win10无法收到wifi
  • 进程process.acore已停止怎么办
  • win系统找回删除文件
  • win8怎么连接宽带账号密码
  • 全志科技在国内芯片界地位
  • surf apk android
  • jquery获取数据
  • 自动重启服务脚本
  • javascript代码写在哪个标签里
  • python 技巧总结
  • 深入理解计算机系统 电子书
  • mac安装nodejs的权限问题
  • 专票单张限额多少
  • 北京社保退保手续办理
  • 德勤 税务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设