python 中的堆

文章目录

      • 小根堆的特点
      • Python 中的 `heapq` 模块
        • 1. `heapq.heappush(heap, item)`
        • 2. `heapq.heappop(heap)`
        • 3. `heapq.heapify(x)`
        • 4. `heapq.heappushpop(heap, item)`
        • 5. `heapq.heapreplace(heap, item)`
        • 6. `heapq.nsmallest(n, iterable)`
        • 7. `heapq.nlargest(n, iterable)`
      • 小根堆的应用场景
      • 示例:使用小根堆实现优先级队列
      • 注意事项

在这里插入图片描述

在 Python 中,小根堆(Min Heap)是一种特殊的二叉树数据结构,其中每个父节点的值都小于或等于其子节点的值。堆的根节点(堆顶)是整个堆中的最小元素。Python 提供了内置模块 heapq 来实现堆操作,默认情况下 heapq 实现的是小根堆。


小根堆的特点

  1. 堆顶元素最小:堆顶元素始终是堆中的最小值。
  2. 完全二叉树:堆是一棵完全二叉树,通常用数组来实现。
  3. 高效操作
    • 插入元素的时间复杂度为 (O(\log n))。
    • 删除堆顶元素的时间复杂度为 (O(\log n))。
    • 获取堆顶元素的时间复杂度为 (O(1))。

Python 中的 heapq 模块

heapq 是 Python 的标准库模块,提供了对小根堆的支持。以下是 heapq 的常用函数:

1. heapq.heappush(heap, item)
  • 将元素 item 插入堆 heap 中,并保持堆的性质。
  • 示例:
    import heapq
    heap = []
    heapq.heappush(heap, 3)
    heapq.heappush(heap, 1)
    heapq.heappush(heap, 2)
    print(heap)  # 输出: [1, 3, 2]
    
2. heapq.heappop(heap)
  • 弹出并返回堆 heap 中的最小元素(堆顶元素),同时保持堆的性质。
  • 示例:
    import heapq
    heap = [1, 3, 2]
    print(heapq.heappop(heap))  # 输出: 1
    print(heap)  # 输出: [2, 3]
    
3. heapq.heapify(x)
  • 将列表 x 原地转换为一个堆,时间复杂度为 (O(n))。
  • 示例:
    import heapq
    heap = [3, 1, 2]
    heapq.heapify(heap)
    print(heap)  # 输出: [1, 3, 2]
    
4. heapq.heappushpop(heap, item)
  • 先将元素 item 插入堆中,然后弹出并返回堆中的最小元素。
  • 示例:
    import heapq
    heap = [1, 3, 2]
    print(heapq.heappushpop(heap, 0))  # 输出: 0
    print(heap)  # 输出: [1, 3, 2]
    
5. heapq.heapreplace(heap, item)
  • 先弹出并返回堆中的最小元素,然后将元素 item 插入堆中。
  • 示例:
    import heapq
    heap = [1, 3, 2]
    print(heapq.heapreplace(heap, 0))  # 输出: 1
    print(heap)  # 输出: [0, 3, 2]
    
6. heapq.nsmallest(n, iterable)
  • 返回可迭代对象 iterable 中最小的 n 个元素。
  • 示例:
    import heapq
    data = [3, 1, 4, 1, 5, 9, 2, 6]
    print(heapq.nsmallest(3, data))  # 输出: [1, 1, 2]
    
7. heapq.nlargest(n, iterable)
  • 返回可迭代对象 iterable 中最大的 n 个元素。
  • 示例:
    import heapq
    data = [3, 1, 4, 1, 5, 9, 2, 6]
    print(heapq.nlargest(3, data))  # 输出: [9, 6, 5]
    

小根堆的应用场景

  1. 优先级队列:小根堆常用于实现优先级队列,堆顶元素始终是优先级最高的元素。
  2. Top K 问题:例如查找最小的 K 个数或最大的 K 个数。
  3. Dijkstra 算法:在图的最短路径算法中,小根堆用于高效地找到当前距离最小的节点。
  4. 合并有序列表:可以使用堆来高效地合并多个有序列表。

示例:使用小根堆实现优先级队列

import heapq# 创建一个优先级队列
pq = []
heapq.heappush(pq, (2, "code"))
heapq.heappush(pq, (1, "eat"))
heapq.heappush(pq, (3, "sleep"))# 按优先级顺序处理任务
while pq:priority, task = heapq.heappop(pq)print(f"Processing task: {task} (priority: {priority})")

输出

Processing task: eat (priority: 1)
Processing task: code (priority: 2)
Processing task: sleep (priority: 3)

注意事项

  1. 默认是小根堆heapq 默认实现的是小根堆。如果需要大根堆,可以通过插入负数来实现。
    • 示例:
      import heapq
      heap = []
      heapq.heappush(heap, -3)
      heapq.heappush(heap, -1)
      heapq.heappush(heap, -2)
      print(-heapq.heappop(heap))  # 输出: 3
      
  2. 堆的元素可以是元组heapq 支持元组作为元素,元组的第一个元素用于比较(优先级)。

通过 heapq 模块,Python 提供了一种简单而高效的方式来实现小根堆,适用于各种需要高效管理最小值的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【RocketMQ】RocketMq之IndexFile深入研究

一:RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分: CommitLog:存储消息的元数据。所有消息都会顺序存⼊到CommitLog⽂件当中。CommitLog由多个⽂件组成,每个⽂件固定⼤⼩1G。以第⼀条消 息的偏移量为⽂件名。 ConsumerQue…

注解与反射基础

注解 概述 注解(Annotation),从jdk5.0引入。 作用 不是程序本身,可以对程序作出解释(这一点和注释没什么区别)可以被其他程序读取 格式 注释是以“注释名”在代码中存在的,还可以添加一些…

WebSocket——环境搭建与多环境配置

一、前言:为什么要使用多环境配置? 在开发过程中,我们通常会遇到多个不同的环境,比如开发环境(Dev)、测试环境(Test)、生产环境(Prod)等。每个环境的配置和需…

SliverAppBar的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverGrid组件相关的内容,本章回中将介绍SliverAppBar组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverAppBar和普通的AppBar类似,它们的…

BFS(广度优先搜索)——搜索算法

BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。…

【Java基础-42.3】Java 基本数据类型与字符串之间的转换:深入理解数据类型的转换方法

在 Java 开发中,基本数据类型与字符串之间的转换是非常常见的操作。无论是从用户输入中读取数据,还是将数据输出到日志或界面,都需要进行数据类型与字符串之间的转换。本文将深入探讨 Java 中基本数据类型与字符串之间的转换方法,…

数据库 - Sqlserver - SQLEXPRESS、由Windows认证改为SQL Server Express认证进行连接 (sa登录)

本文讲SqlServer Express版本在登录的时候, 如何由Windows认证,修改为Sql Server Express认证。 目录 1,SqlServer Express的Windows认证 2,修改为混合认证 3,启用sa 用户 4,用sa 用户登录 下面是详细…

机器学习--学习计划

3周机器学习速成计划 基于「28原则」,聚焦机器学习20%的核心概念,覆盖80%的常见应用场景。计划分为 理论学习 项目实战,每周学习后通过5个递进项目巩固知识。 📅 第1周:数据与监督学习基础 学习目标:掌握…

CNN的各种知识点(四): 非极大值抑制(Non-Maximum Suppression, NMS)

非极大值抑制(Non-Maximum Suppression, NMS) 1. 非极大值抑制(Non-Maximum Suppression, NMS)概念:算法步骤:具体例子:PyTorch实现: 总结: 1. 非极大值抑制(…

GWO优化SVM回归预测matlab

灰狼优化算法(Grey Wolf Optimizer,简称 GWO),是由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出的群智能优化算法。该算法的设计灵感源自灰狼群体的捕食行为,核心思想是对灰狼社会的结构与行为模式进行模仿。 …

elasticsearch8.15 高可用集群搭建(含认证Kibana)

文章目录 1.资源配置2.系统参数优化3.JDK17安装4.下载&安装ES 8.155.生成ES的证书(用于ES节点之间进行安全数据传输)6.修改ES 相关配置文件7.创建es用户并启动8.配置ES的账号和密码(用于ES服务端和客户端)9.下载和安装Kibana10.编辑Kibana配置文件11.启动Kiabana12.访问Kia…

地址查询API接口:高效查询地址信息,提升数据处理效率

地址查询各省市区API接口 地址查询是我们日常生活中经常遇到的一个需求,无论是在物流配送、地图导航还是社交网络等应用中,都需要通过地址来获取地理位置信息。为了满足这个需求,我们可以使用地址查询API接口来高效查询地址信息,提…

3、C#基于.net framework的应用开发实战编程 - 实现(三、三) - 编程手把手系列文章...

三、 实现; 三.三、编写应用程序; 此文主要是实现应用的主要编码工作。 1、 分层; 此例子主要分为UI、Helper、DAL等层。UI负责便签的界面显示;Helper主要是链接UI和数据库操作的中间层;DAL为对数据库的操…

leetcode解题思路分析(一百六十三)1409 - 1415 题

查询带键的排列 给定一个正整数数组 queries ,其取值范围在 1 到 m 之间。 请你根据以下规则按顺序处理所有 queries[i](从 i0 到 iqueries.length-1): 首先,你有一个排列 P[1,2,3,…,m]。 对于当前的 i ,找…

【自学笔记】GitHub的重点知识点-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 GitHub使用指南详细知识点一、GitHub基础与账户管理1. GitHub简介2. 创建与管理GitHub账户3. 创建与配置仓库(Repository) 二、Git基础与Git…

vscode软件操作界面UI布局@各个功能区域划分及其名称称呼

文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上,Visual Studio Code 是一个代码编辑器,其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…

类和对象(下)——类型转化 static成员 内部类 匿名对象 拷贝对象优化

一、类型转换 1.1 类型转化特点 C支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。构造函数前面加explicit就不再支持隐式类型转换。类类型的对象之间也可以隐式转换,需要相应的构造函数支持 内置类型转换为类类型对象&#…

基于场景图的零样本目标导航

参考论文:SG-Nav:Online 3D Scene Graph Prompting for LLM-based Zero-shot Object Navigation 0 前言 基于现成的视觉基础模型VFMs和大语言模型LLM构建了无需任何训练的零样本物体巡航框架SG-Nav。 通过VLMs将机器人对场景的观测构建为在线的3D场景图…

深入解析 clone():高效的进程与线程创建方法(中英双语)

深入解析 clone():高效的进程与线程创建方法 1. 引言 在 Unix/Linux 系统中,传统的进程创建方式是 fork(),它会复制父进程的地址空间来创建子进程。然而,fork() 复制的资源往往会被 exec() 立即替换,这会导致额外的内…