【python床头书】 heapq 堆队列算法参数用法示例详解

python数据结构——快速掌握简单高效的堆排序heapq库堆算法 python heapq库实现堆与对排序的用法,引用库的方法:import heapq;如果想省去前缀就使用from heapq import* 阅读详情

【python床头书】 heapq 堆队列算法函数方法示例详解

源自专栏《Python床头书、图计算、ML目录(持续更新)》

概览

本模块提供了堆队列算法(也称为优先队列算法)的实现。

堆是一种二叉树结构,其中每个父节点的值都小于或等于其子节点的值。这个实现使用数组来表示堆,对于所有的k,满足 heap[k] <= heap[2k+1] 和 heap[k] <= heap[2k+2],索引从零开始计数。为了比较方便,不存在的元素被视为无穷大。堆的一个有趣特性是它的最小元素总是位于根节点 heap[0]。

以下API与教科书中的堆算法有两个不同之处:(a) 使用基于零的索引。这样做使得节点索引与其子节点索引之间的关系稍微不太明显,但更适合Python使用基于零的索引。(b) 我们的弹出方法返回的是最小元素,而不是最大元素(在教科书中称为“最小堆”,而“最大堆”由于适用于原地排序,在文本中更为常见)。

这两点使得我们可以将堆视为普通的Python列表而没有令人惊讶的地方:heap[0] 是最小元素,并且 heap.sort() 可以维持堆的特性!

函数方法

要创建一个堆,可以使用初始化为空列表的方式,或者通过函数 heapify() 将已经存在的列表转换为堆。

提供了以下函数:

  • heapq.heappush(heap, item):将值 item 推入堆中,同时保持堆的特性。
  • heapq.heappop(heap):从堆中弹出并返回最小的元素,同时保持堆的特性。如果堆为空,则引发 IndexError。要访问最小元素而不弹出它,请使用 heap[0]。
  • heapq.heappushpop(heap, item):将 item 推入堆中,然后从堆中弹出并返回最小的元素。这个组合操作比先调用 heappush() 再调用 heappop() 更高效。
  • heapq.heapify(x):原地将列表 x 转换为一个堆,时间复杂度为线性。
  • heapq.heapreplace(heap, item):从堆中弹出并返回最小的元素,并推入新的元素。堆的大小不会改变。如果堆为空,则引发 IndexError。

这一步操作比先进行 heappop() 然后进行 heappush() 更高效,并且在使用固定大小的堆时更为合适。pop/push 组合总是返回堆中的一个元素,并用 item 替换它。

返回的值可能比添加的 item 更大。如果不希望出现这种情况,请考虑使用 heappushpop()。它的 push/pop 组合返回两个值中较小的一个,并将较大的值保留在堆中。

该模块还提供了基于堆的三个通用函数。

  • heapq.merge(*iterables, key=None, reverse=False):将多个已排序的输入合并为单个已排序的输出(例如,合并来自多个日志文件的时间戳条目)。返回排序值的迭代器。

  • 类似于 sorted(itertools.chain(*iterables)),但返回一个可迭代对象,不会一次性将数据全部加载到内存中,并且假定每个输入流已经按照从小到大的顺序排序。

  • 有两个可选参数,必须作为关键字参数指定。

    • key 指定一个接受一个参数的函数,用于从每个输入元素中提取比较键。默认值为 None(直接比较元素)。

    • reverse 是一个布尔值。如果设置为 True,则将输入元素合并得到的结果与按照相反顺序进行比较时的行为相同。要实现类似于 sorted(itertools.chain(*iterables), reverse=True) 的行为,所有的可迭代对象必须按照从大到小的顺序排序。

    在3.5版本中进行了更改:添加了可选的 key 和 reverse 参数。

  • heapq.nlargest(n, iterable, key=None):从由可迭代对象 iterable 定义的数据集中返回包含 n 个最大元素的列表。如果提供了 key 参数,则指定一个接受一个参数的函数,用于从 iterable 中的每个元素中提取比较键(例如,key=str.lower)。等效于 sorted(iterable, key=key, reverse=True)[:n]。

  • heapq.nsmallest(n, iterable, key=None):从由可迭代对象 iterable 定义的数据集中返回包含 n 个最小元素的列表。如果提供了 key 参数,则指定一个接受一个参数的函数,用于从 iterable 中的每个元素中提取比较键(例如,key=str.lower)。等效于 sorted(iterable, key=key)[:n]。

后两个函数对于较小的 n 值表现最佳。对于较大的值,使用 sorted() 函数更高效。当 n==1 时,使用内置的 min() 和 max() 函数更高效。如果需要重复使用这些函数,请考虑将可迭代对象转换为实际的堆。

基本示例:

可以通过将所有值推入堆中,然后依次弹出最小的值来实现堆排序:

def heapsort(iterable):
    h = []
    for value 
3天干完6个月的活,Claude把模型搬上AMD 一条挺刺激的消息:Anthropic 给投资人的材料里有一张幻灯片,写着它的 Claude Mythos Preview 只花了大约​,就摸清了怎么让另一个 Claude 模型在 AMD 的 MI355X 上跑起来。同一处还写了个对照数字:过去给一块新芯片做推理适配,通常要几十名工程师、​。3 天对 6 个月,这个比值太扎眼,当天中文互联网上就冒出一堆「英伟达的护城河塌了」的说法。我把能翻到的材料都翻了一遍,越看越觉得,塌掉的那一小块是真的,可塌的位置和很多人想的不一样。 阅读详情

相关推荐

随机变量序列 收敛 检验 matlab,利用MATLAB验证样条插值的收敛性

问题提出多项式插值是不收敛的,即插值的节点多,效果不一定就好。对样条函数插值又如何呢?理论上证明样条插值的收敛性是比较困难的,但通过本实验可以验证这一理论结果。.实验内容请按一定的规则分别选择等距或者非等距的插值节点,并不断增加插值节点的个数。考虑实验2.1中的函数或选择其他你有兴趣的函数。(中函数)。实验要求(1)随节点个数增加,比较被逼近函数和样条插值函数误差的变化情况。分析所得结果并与拉格朗...

weixin_30895121的博客 4735

LTspice进阶技巧-031.一键加密仿真模型:LTspice Encrypt Tool实战指南

本文详细介绍了LTspice Encrypt Tool的使用方法,帮助工程师一键加密LTspice仿真模型,保护知识产权。通过图形化界面简化操作流程,支持批量加密和兼容性处理,适用于电路设计中的模型保护需求。

weixin_28304023的博客 202

RealSense D455的标定并运行VINS-FUSION

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_40186909的博客 2万+

WebVTT中的文本轨道(Text Tracks,TT)到底是什么鬼?

WebVTT,全称是The Web Video Text Tracks Format,意思是网络视频文本轨道格式。那么到底什么是文本轨道(Text Tracks)呢?这篇文章希望一探究竟。

码农1479的博客 1986

威联通改装飞牛fnOS全攻略:从刷机到Docker影视部署

NAS系统是家庭数字存储的核心,x86架构的威联通设备凭借通用引导和驱动支持,成为改装替代系统的理想平台。飞牛fnOS作为基于Debian的国产NAS系统,以简洁UI、内置Docker和影视墙以及硬件转码能力,吸引了大量玩家。通过U盘引导安装、BIOS调整、系统盘SSD部署,可实现系统切换;原机械硬盘可挂载为存储池,配合Docker部署下载、远程访问等容器,影视中心自动削刮海报墙,硬件转码保障4K播放。改装过程需注意引导失败、硬盘识别、核显驱动等问题。这套方案能让老旧威联通焕发新生,兼顾易用性与扩展性。本文

weixin_33585822的博客 774

CDD数据库文件制作(十一)——服务配置(0x19_DTC Code)

虽然选择Copy和Reference都可以加载DTC,但是如果我们在DTC库中有修改DTC,通过Copy的方式加载的DTC在DTC Table中不会跟着DTC库的修改而自动更新。通过Reference的方式加载的DTC可以自动更新。找到Fault Memory的DTC Table,鼠标放在DTC Table区域,右键点击选择Copy …根据需要(客户协议)勾选响应的19服务子功能。如何创建一个新的DTC code?按照字母与下方要素可做一一对应。首先在DTC库中新建DTC。支持10 01/10 03。

LOVE135149的博客 1917

数据库系统概论第五版课后习题答案第十二章

对元组的插入、删除、修改;语义检查的具体做法是,DBMS读取数据字典,检查是否存在与该语句中的表、视图或索引等要创建的对象相同的对象名,检查该用户是否具有创建数据库对象的权限。答:操作系统提供的封锁机制和DBMS的封锁机制在封锁对象、封锁对象的状态、封锁的粒度、及封锁的类型上存在很大的差别,操作系统的封锁机制不能直接应用在DBMS中,DBMS必须重新设计,来满足复杂的封锁需求。数据库的建立和维护包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组织和重构造以及性能监测分析等功能。

wenling54321的博客 694

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

JasonH2021的博客 405

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 【Spark原理系列】Accumulator累加器原理用法示例源码详解
下一篇: 【scala原理系列】PriorityQueue原理用法示例源码详解
BigDataMLApplication
博客等级 码龄11年 7363粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值