文章目录
- [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是你自己起的名字,是你自己起的列表

常见坑
