什么是堆?
堆(Heap)是一种特殊的完全二叉树,满足堆性质:任意节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值。 在 Python 中,默认使用的是 最小堆,即根节点为堆中最小元素。
Python 通过标准库模块 heapq 提供堆操作支持,底层使用列表(list)实现。
heapq 模块常用函数
heapq.heappush(heap, item):向堆中插入元素heapq.heappop(heap):弹出并返回最小元素heapq.heapify(x):将列表 x 转换为堆(原地操作)heapq.heapreplace(heap, item):弹出最小元素并压入新元素heapq.nlargest(n, iterable):返回最大的 n 个元素heapq.nsmallest(n, iterable):返回最小的 n 个元素
基本使用示例
import heapq
# 创建一个空堆
heap = []
# 插入元素
heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
heapq.heappush(heap, 8)
print(heap) # [2, 5, 8]
# 弹出最小元素
min_val = heapq.heappop(heap)
print(min_val) # 2
print(heap) # [5, 8]
# 将普通列表转为堆
nums = [10, 3, 7, 1]
heapq.heapify(nums)
print(nums) # [1, 3, 7, 10]
应用场景
堆常用于以下场景:
- 实现优先队列(Priority Queue)
- Top-K 问题(如找出最大的 10 个数)
- 合并多个有序流(如多路归并)
- Dijkstra 最短路径算法
- 堆排序(Heapsort)
实战:获取 Top-3 最小分数
scores = [88, 92, 75, 96, 83, 70, 90]
top3 = heapq.nsmallest(3, scores)
print(top3) # [70, 75, 83]
注意事项
- Python 的
heapq实现的是 最小堆。 - 若需最大堆,可对元素取负值:
heapq.heappush(heap, -value)。 - 堆不是线程安全的,多线程环境下需加锁。
- 堆中的元素必须支持比较操作(如数字、字符串等)。
扩展阅读
想深入了解?推荐阅读: Python 78TP heapq 文档, 或学习《算法导论》中关于堆的章节。