Python heapq (堆/优先队列)

文章目录

  • [heapq 是什么](#heapq 是什么)
  • 基本操作:建堆、入堆、出堆
    • [heapq 只有最小堆,怎么做最大堆?经典做法:取相反数](#heapq 只有最小堆,怎么做最大堆?经典做法:取相反数)
    • [堆里放"复杂对象":用 tuple 做优先级](#堆里放“复杂对象”:用 tuple 做优先级)
  • 创建空堆
      • [heapq:没有"自定义比较函数"参数;要靠放入的元素本身可比较(通常用 tuple 的第一个元素当优先级)](#heapq:没有“自定义比较函数”参数;要靠放入的元素本身可比较(通常用 tuple 的第一个元素当优先级))
    • [在 Python 里堆就是一个 list,所以判断"堆不空"最常用就是看列表是否为空。](#在 Python 里堆就是一个 list,所以判断“堆不空”最常用就是看列表是否为空。)
    • 常见坑

heapq 是什么

什么是堆呢?

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。

所以大家经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素)

基本操作:建堆、入堆、出堆

python 复制代码
import heapq

a = [5, 1, 4, 2, 8]
heapq.heapify(a)
print(a)       # 变成堆的内部结构(不保证整体有序) [1, 2, 4, 5, 8]
print(a[0])    # 最小值



heapq 只有最小堆,怎么做最大堆?经典做法:取相反数

堆里放"复杂对象":用 tuple 做优先级


创建空堆


heapq:没有"自定义比较函数"参数;要靠放入的元素本身可比较(通常用 tuple 的第一个元素当优先级)

在 Python 里堆就是一个 list,所以判断"堆不空"最常用就是看列表是否为空。

注意时heap不是heapq,heap是你自己起的名字,是你自己起的列表

常见坑

相关推荐
用户8356290780514 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780515 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生13 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师13 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码13 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf13 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780511 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent1 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python