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引入。 作用 不是程序本身,可以对程序作出解释(这一点和注释没什么区别)可以被其他程序读取 格式 注释是以“注释名”在代码中存在的,还可以添加一些…

SliverAppBar的功能和用法

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

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

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

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

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

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为对数据库的操…

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场景图…

开屏广告-跳过神器

给大家介绍一款超实用的软件——SKIP,它堪称李跳跳的最佳平替!这款软件已经在Github开源免费,完全无需担心内置源问题,也无需导入任何规则。安装完成后,即可直接使用,非常便捷! 首次打开软件时…

大模型本地化部署(Ollama + Open-WebUI)

文章目录 环境准备下载Ollama模型下载下载Open-WebUI 本地化部署的Web图形化界面本地模型联网查询安装 Docker安装 SearXNG本地模型联网查询 环境准备 下载Ollama 下载地址:Ollama网址 安装完成后,命令行里执行命令 ollama -v查看是否安装成功。安装成…

自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)

开源地址:VMwork 要使终端不弹出&#xff0c; #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…

【游戏设计原理】97 - 空间感知

一、游戏空间的类型 将游戏设计中的空间设计单独提取出来&#xff0c;可以根据其结构、功能和玩家的交互方式划分为以下几种主要类型。这些类型可以单独存在&#xff0c;也可以组合使用&#xff0c;以创造更加复杂和有趣的游戏体验。 1. 线性空间 定义&#xff1a;空间设计是…

基于开源AI智能名片2 + 1链动模式S2B2C商城小程序视角下的个人IP人设构建研究

摘要&#xff1a;本文深入探讨在开源AI智能名片2 1链动模式S2B2C商城小程序的应用场景下&#xff0c;个人IP人设构建的理论与实践。通过剖析个人IP人设定义中的“诉求”“特质”“可感知”三要素&#xff0c;结合该小程序特点&#xff0c;阐述其对个人IP打造的影响与推动作用&…

数据库和数据表的创建、修改、与删除

1.标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量名限制为29个 必须只能包含A-Z,a-z,0-9,_共63个字符 数据库名、表名、字段名等对象名中间不能包含空格 同一个MySQL软件中&#xff0c;数据库不能同名&#xff1b;同一个库中&#xff0c;表不能重名&#…

算法日记10:SC62求和(单调栈)(共享求解)

一、题目 二、题解&#xff1a; 1、首先&#xff0c;我们看到题目的第一个想法&#xff0c;就是把样例答案如何求解给列出来&#xff0c;图例如下 2、通过分析样例&#xff0c;可以很清晰的发现每一个数字都有其管辖的区间&#xff0c;因此我们可以想到能否找到一个数字它所管…