python 中的堆

ops/2025/2/4 19:08:43/

文章目录

      • 小根堆的特点
      • 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.ppmy.cn/ops/155653.html

相关文章

AP单类平均准确率

P_true N_true P_pred TP Fp N_pred FN TNP NTP(真正样本,与真实框IoU大于阈值的框) FP(假正样本,与真实框IoU小于阈值的框) TN(真负样本,背景)…

【C语言】填空题/程序填空题1

1. 下列程序取出一个整数x的二进制表示中,从第p位开始的n位二进制,并输出所表示的整数值。如: 输入:-17 5 3 输出:5 【说明】整数-17的32位二进制表示为:11111111 11111111 11111111 11101111,…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 导入需要的类# Important: # 你需要通过以下指令把 form.ui转为ui…

DDD - 领域事件_解耦微服务的关键

文章目录 Pre领域事件的核心概念领域事件的作用领域事件的识别领域事件的技术实现领域事件的运行机制案例领域事件驱动的优势 Pre DDD - 微服务设计与领域驱动设计实战(中)_ 解决微服务拆分难题 EDA - Spring Boot构建基于事件驱动的消息系统 领域事件的核心概念 领域事件&a…

四、jQuery笔记

(一)jQuery概述 jQuery本身是js的一个轻量级的库,封装了一个对象jQuery,jquery的所有语法都在jQuery对象中 浏览器不认识jquery,只渲染html、css和js代码,需要先导入jQuery文件,官网下载即可 jQuery中文说明文档:https://hemin.cn/jq/ (二)jQuery要点 1、jQuery对象 …

在AWS上使用Flume搜集分布在不同EC2实例上的应用程序日志具体流程和代码

在AWS上使用Flume搜集日志的一个典型应用案例涉及将分布在不同EC2实例上的应用程序日志实时收集并集中存储到Amazon S3或Amazon HDFS(如果已部署)中,以供后续分析和处理。以下是该案例的详细步骤: 环境准备 • 确保在AWS上有一组…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

数据的添加、更新与删除

一,添加数据 INSERT INTO 表名 VALUES(); 存在两种书写形式: (1)自主填写 自主填写的形式: ①根据创建表的字段结构,依次填入数据。 ②填入数据时,自己指明字段结构,依据就近…