python 中的堆

news/2025/2/4 10:02:35 标签: 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 中,并保持堆的性质。
  • 示例:
    python">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 中的最小元素(堆顶元素),同时保持堆的性质。
  • 示例:
    python">import heapq
    heap = [1, 3, 2]
    print(heapq.heappop(heap))  # 输出: 1
    print(heap)  # 输出: [2, 3]
    
3. heapq.heapify(x)
  • 将列表 x 原地转换为一个堆,时间复杂度为 (O(n))。
  • 示例:
    python">import heapq
    heap = [3, 1, 2]
    heapq.heapify(heap)
    print(heap)  # 输出: [1, 3, 2]
    
4. heapq.heappushpop(heap, item)
  • 先将元素 item 插入堆中,然后弹出并返回堆中的最小元素。
  • 示例:
    python">import heapq
    heap = [1, 3, 2]
    print(heapq.heappushpop(heap, 0))  # 输出: 0
    print(heap)  # 输出: [1, 3, 2]
    
5. heapq.heapreplace(heap, item)
  • 先弹出并返回堆中的最小元素,然后将元素 item 插入堆中。
  • 示例:
    python">import heapq
    heap = [1, 3, 2]
    print(heapq.heapreplace(heap, 0))  # 输出: 1
    print(heap)  # 输出: [0, 3, 2]
    
6. heapq.nsmallest(n, iterable)
  • 返回可迭代对象 iterable 中最小的 n 个元素。
  • 示例:
    python">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 个元素。
  • 示例:
    python">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. 合并有序列表:可以使用堆来高效地合并多个有序列表。

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

python">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 默认实现的是小根堆。如果需要大根堆,可以通过插入负数来实现。
    • 示例:
      python">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.niftyadmin.cn/n/5841473.html

相关文章

【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】

Jetson配置YOLOv11环境(6)PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…

模型蒸馏(ChatGPT文档)

文章来源: https://chatgpt.cadn.net.cn/docs/guides_distillation 模型蒸馏 使用蒸馏技术改进较小的模型。 模型蒸馏允许您利用大型模型的输出来微调较小的模型,使其能够在特定任务上实现类似的性能。此过程可以显著降低成本和延迟,因为较小…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式,由于跨域资源共享(cors)是浏览器的一种安全机制,它会阻止前端应用…

Docker入门篇(Docker基础概念与Linux安装教程)

目录 一、什么是Docker、有什么作用 二、Docker与虚拟机(对比) 三、Docker基础概念 四、CentOS安装Docker 一、从零认识Docker、有什么作用 1.项目部署可能的问题: 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题&#xff1…

【番外】lombok在IDEA下失效的解决方案

IDEA 的Lombok在编译后,发现类明明加了注解,但找不到方法 多数情况下,是因为lombok的版本切换时发生了错误。 这时点击setting->Build,Execution,Deployment->Compiler->Annotation Processors 选中失效的模块,把process…

使用Pytorch训练一个图像分类器

一、准备数据集 一般来说,当你不得不与图像、文本或者视频资料打交道时,会选择使用python的标准库将原始数据加载转化成numpy数组,甚至可以继续转换成torch.*Tensor。 对图片而言,可以使用Pillow库和OpenCV库对视频而言&#xf…

(手机安卓版)植物大战僵尸幼儿园版本,开启你的冒险之旅!

欢迎来到植物大战僵尸中文版,园长Jen已准备好迎接你的挑战!在这个充满乐趣和策略的游戏中,你将体验到多种游戏模式,每种模式都带来不同的挑战和乐趣。 游戏模式: 冒险模式:踏上刺激的冒险旅程,…

全域旅游景区导览系统小程序独立部署

**全域旅游景区导览系统:数字化赋能景区智慧化升级** ——打造一站式信息服务生态,助力旅游产业高质量发展 --- ### **一、行业痛点:传统景区服务模式面临挑战** 在旅游消费需求多元化、个性化发展的今天,全国景区普遍面临…