这个模块提供了堆队列算法的实现,也称为优先队列算法。这个模块最常用的操作是将一个列表转换为一个堆,默认是小根堆(它的每个父节点的值都只会小于或所有孩子节点的值),而且常用的主要有三个方法:
① heapq.heappush(heap, item):将 item 的值加入 heap (一般为列表)中,并且保持堆的不变性,item可以为元组类型这样可以使用元组存储多个属性值
② heapq.heappop(heap):弹出并返回 heap 的最小的元素,保持堆的不变性。如果堆为空,抛出 IndexError 。使用 heap[0] ,可以只访问最小的元素而不弹出它
③ heapq.heapify(x):线性时间内原地将list x 转换成堆
有的题目要求为大根堆这个时候在存储的时候可以将某个元素存储为负数,这样相当于维护的是一个大根堆
其余的方法可以参照官方的标准库文档,并且当堆中的元素为元组的时候会按照元组的第一个元素来维持小根堆,下面是具体的例子:
import heapq
if __name__ == '__main__':
# 要创建一个堆, 可以使用list来初始化为[], 或者可以通过一个函数heapify(), 来把一个list转换成堆.
h = []
# 往堆中加入元素并且保证堆的不变性, 当加入堆中的元素为元组类型的时候按照元组的第一个参数维持堆的不变性
heapq.heappush(h, (4, "a"))
heapq.heappush(h, (2, "b"))
heapq.heappush(h, (4, "c"))
while len(h):
# 弹出并返回heap的最小的元素, 保持堆的不变性
print(heapq.heappop(h))
h = [10, 6, 8, 3, 4, 1, 2, 7, 9, 5]
# 将list转换成堆, 原地, 线性时间内
heapq.heapify(h)
print(h)