【Python】heapq模块(操作最小堆,主要用途优先队列)

Python中heapq模块被称为堆队列算法,也成为优先队列算法。堆的主要用途是优先队列和堆排序。

堆(二叉树的应用):最小堆,最大堆。

  • 最小堆:父节点小于等于所有子节点,左右子节点无大小要求(但先有左节点才有右节点)。
  • 最大堆:父节点大于等于所有子节点,左右子节点无大小要求(但先有左节点才有右节点)。

通常用数组实现堆:

  • 最小堆:堆[i] <= 堆[2i + 1] and 堆[i] <= 堆[2i + 2],i从0开始。即父节点小于等于左右子节点。
  • 最大堆:堆[i] >= 堆[2i + 1] and 堆[i] >= 堆[2i + 2],i从0开始。即父节点大于等于左右子节点。

heapq模块操作最小堆,添加元素时按最小堆排序,取出元素时则取出堆中最小值。(但最大堆的效果可用符号负号“-”实现。见本文末尾)


导入模块:

import heapq


最小堆实现: 

1、创建最小堆

(1-1)python中可使用空列表: [ ]

# 创建堆
h = []

(1-2)可使用函数将已有列表转为堆:heapq.heapify(...)

# 创建堆(将已有列表转为堆)
heapq.heapify(已有列表)

2、往最小堆中添加元素:heapq.heappush(...)

# 往最小堆中添加元素
heapq.heappush(最小堆, 元素)

3、从最小堆中取出最小值:heapq.heappop(...)

# 从最小堆中取出最小值
heapq.heappop(最小堆)

注:若堆中没有元素,则报错IndexError。 

4、添加元素和取出最小值同时操作

(4-1)先heappush再heappop:heapq.heappushpop(...)

# 先heappush再heappop:先将新元素添加到堆,再从堆中取出最小值
heapq.heappushpop(最小堆, 新元素)

注:先将新元素添加到堆,再从堆中取出最小值。若添加的新元素为最小值,则取出的就是新添加的该元素。

(4-2)先heappop再heappush:heapq.heapreplace(...)

# 先heappop再heappush:先从堆中取出最小值,再往堆中添加新元素
heapq.heapreplace(最小堆, 新元素)

注:先从堆中取出最小值,再将新元素添加到堆。若添加的新元素为最小值,则取出的不是新添加的该元素,而是添加前的最小值。

5、从最小堆中获取n个最大值或最小值

(5-1)从最小堆中获取n个最大值:heapq.nlargest(...)

# 从最小堆中获取n个最大值
heapq.nlargest(n, 可迭代对象, key=None)

注:参数key是条件,例如:字符串按小写字母获取最大值,元组按下标为1的值获取最大值,等等。 

(5-2)从最小堆中获取n个最小值:heapq.nsmallest(...)

#从最小堆中获取n个最小值
heapq.nsmallest(n, 可迭代对象, key=None)

注:参数key是条件,例如:字符串按小写字母获取最小值,元组按下标为1的值获取最小值,等等。 

6、将多个可迭代对象拼接成一个迭代器:heapq.merge(...)

# 将多个可迭代对象拼接成一个迭代器(已排序,确保参数中的可迭代对象已排序)
heapq.merge(*iterables, key=None, reverse=False)

注:若迭代器从小到大排序,则需参数中输入的可迭代对象已从小到大排序。若迭代器降序(参数reverse=True)排序,则需可迭代对象已降序排序。

注:参数key是迭代器排序的条件,例如:字符串按小写字母排序,元组按下标为1的值排序,等等。 


最大堆实现:

1、往堆中添加元素时,元素前面加负号。即堆中各元素为负数,元素值越大、负数后越小。

2、从堆中取出最小值时,前面加负号。即元素最小的(负数值越小、原值越大),负数后即最大值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3810.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MFC图形函数学习06——画椭圆弧线函数

绘制椭圆弧线函数是MFC基本绘图函数&#xff0c;这个函数需要的参数比较多&#xff0c;共四对坐标点。前两对坐标点确定椭圆的位置与大小&#xff0c;后两对坐标确定椭圆弧线的起点与终点。 一、绘制椭圆弧线函数 原型&#xff1a;BOOL Arc(int x1,int y1,int x2,int y2…

Nuxt 项目安装时报错 fetch failed (详细)

报错: ERROR Error: Failed to download template from registry: Failed to download https://raw.githubusercontent.com/nuxt/starter/templates/templates/v3.json: TypeError: fetch failed. 报错原因: 对 raw.githubusercontent.com 进行了 DNS 污染,这会导致你的请…

autox.js下载并保存项目到设备使用

最近刷快手极速版薅羊毛&#xff0c;手动刷有点累。因此找到这个。 PS&#xff1a;更多内容请见官方文档&#xff1a;首页 (autoxjs.com) 1.下载工程化环境&#xff1a;https://github.com/kkevsekk1/AutoX/archive/refs/heads/dev-test.zip 手机软件下载软件&#xff1a;Relea…

ssm+vue680基于SSM的旅游论坛设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

盘点2024年制造业数字化转型的6大发展趋势

​目前制造业的行业数字化发展存在以下几个趋势&#xff1a; 1、从“增量时代”进入“存量时代”&#xff0c;数字化转型成为行业共识 过去几十年&#xff0c;我国装备制造行业从无到有&#xff0c;从小到大&#xff0c;从指数增长的增量时代&#xff0c;进入优化升级的存量时…

安科瑞Acrel-2000ES储能柜能量管理系统的详细介绍-安科瑞 蒋静

Acrel-2000ES储能柜能量管理系统具备全面的储能监控和管理功能。它包括了储能系统设备&#xff08;如PCS、BMS、电表、消防、空调等&#xff09;的详细信息&#xff0c;并实现了数据采集、处理、存储、数据查询与分析、可视化监控、报警管理和统计报表等功能。此外&#xff0c;…

ESP32的下的蓝牙应用笔记(1)——Beacon蓝牙信标

Beacon蓝牙信标简介 ‌Beacon蓝牙信标‌是一种基于蓝牙低功耗&#xff08;BLE&#xff09;技术的设备&#xff0c;主要用于提供位置信息和数据传输服务。它通过周期性地广播信号&#xff0c;能够在一定范围内与其他蓝牙设备进行通信&#xff0c;从而提供精准的位置信息和相关服…

[极客大挑战 2019]BuyFlag1

[极客大挑战 2019]BuyFlag1 审题 菜单有一个home&#xff0c;一个payflag 查看payflag中的要求 具体有三个要求 要有100000000块钱要是CUIT的学生回答正确的密码 知识点 http消息头的伪造 解题 抓包查看信息 看到user0&#xff0c;猜测这应该是CUIT的学生的判断条件…

ElementUI el-form表单多层数组的校验

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; ElementUI el-form表单多层数组的校验 页面效果&#xff1a; 数据结构&#xff1a; addform: {code: ,type: ,value: ,state: 1,remark: ,fieldList: [{fieldCode: ,resolverEntities: [{resolverType: , re…

Java基础-I/O流

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…

FITS论文解析

在本文中&#xff0c;作者探讨了如何将复杂的频域特征提取与简单的线性模型&#xff08;如DLinear&#xff09;结合&#xff0c;以优化时间序列预测任务的效率和解释性。本文的核心思想是利用频域处理和DLinear的简化结构来达到高效的预测能力&#xff0c;同时保留对复杂特征的…

【go从零单排】go三种结构体:for循环、if-else、switch

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 for循环是go语言唯一的循环语句&#xff0c;没错&#xff0c;在go中再也不会看到while true package mainimport …

【数据增强】Mixup

方法来源 Mixup是2018年发表在ICLR上的一种数据增强方法&#xff0c;它通过将多组不同数据集的样本进行线性组合&#xff0c;生成新的样本&#xff0c;从而扩充数据集。 核心思想是从每个batch中随机选择两张图像&#xff0c;并以一定比例混合生成新的图像&#xff0c;新图像的…

基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式

时间序列数据表示了一个随时间记录的值的序列。理解这些序列内部的关系,尤其是在多元或复杂的时间序列数据中,不仅仅局限于随时间绘制数据点(这并不是说这种做法不好)。通过将时间序列数据转换为图,我们可以揭示数据片段内部隐藏的连接、模式和关系,帮助我们发现平稳性和时间连…

Qt学习笔记第41到50讲

第41讲 UI美化遗留问题解决 如上图所示目前记事本的雏形已现&#xff0c;但是还是有待优化&#xff0c;比如右下角的拖动问题。 解决方法&#xff1a; ①首先修改了Widget类的构造函数。 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) {ui->s…

社区养老服务小程序ssm+论文源码调试讲解

第2章 开发环境与技术 校车购票微信小程序的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对校车购票微信小程序用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xf…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

Java基础-集合

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 一、Java集合框架概述 二、Collection接口及其实现 2.1 Collection接口 2.2 List接口及其实现 …

K8S详解(5万字详细教程)

目录 ​编辑 一、集群管理命令 二、命名空间 1. 获取命名空间列表 2. 创建命名空间 3. 删除命名空间 4. 查看命名空间详情 三、Pod 1. Pod概述 2. Pod相位状态 3. 管理命令 3.1 获取命名空间下容器(pod)列表 3.2 查看pod的详细信息 3.3 创建 && 运行 3.4 …

AI驱动的图像文本提取【Llama 3.2-Vision】

本月初&#xff0c;我尝试了书籍封面识别&#xff0c;将 YOLOv10、EasyOCR 和 Llama 3 结合成一个无缝工作流程。结果如何&#xff1f;我自信地从书籍封面中提取标题和作者&#xff0c;就像这是我的新超能力一样。你可以在这篇文章中查看这一旅程&#xff1a;使用自定义 Yolov1…