python——heapq模块
堆
简介
堆是一种基本的数据结构,堆的结构是一棵完全二叉树,并且满足堆积的性质:每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。
分类
堆结构分为大顶堆和小顶堆,在heapq中使用的是小顶堆:
-
大顶堆:每个节点(叶节点除外)的值都大于等于其子节点的值,根节点的值是所有节点中最大的。
-
小顶堆:每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的。
用途
- 构建优先队列
- 堆排序
- 快速找出一个集合中的最小值(或者最大值)
heapq库
heapq 库是Python标准库之一,提供了构建小顶堆的方法和一些对小顶堆的基本操作方法(如入堆,出堆等),可以用于实现堆排序算法。
在heapq库中,heapq使用的数据类型是Python的基本数据类型 list ,要满足堆积的性质,则在这个列表中,索引 k 的值要小于等于索引 2k+1 的值和索引 2k+2 的值(在完全二叉树中,将数据按广度优先插入,索引为k的节点的子节点索引分别为2k+1和2k+2)。
heapify(x)
heapq.heapify(x) :在线性时间内将列表 x 转换为堆。
heappush(list,x)
heapq.heappush(列表, item):把值item加到堆队列,此时依然满足堆的特点。
heappop(list)
heapq.heappop(列表) :从堆队列中弹出并返回最小值, 此时依然满足堆的特点。
heap[0]
item = heap[0]:查看堆中最小的值,不弹出。
heapreplace(list,x)
item = heapq.heapreplace(列表,item):从堆队列中弹出最小值,然后将值item加到堆队列,此时依然满足堆的特点且堆大小不变。但是需注意是先弹出再加入。
示例
import heapq
arr = [8,5,2,10]
heapq.heapify(arr)
print(arr) # [2,5,8,10]
print(arr[0]) # 2
heapq.heappush(arr,1)
print(arr[0]) # 1
x=heapq.heappop(arr)
print(x) # 1
print(arr[0]) # 2
y=heapq.heapreplace(arr,0)
print(y) # 2
print(arr[0]) # 0

浙公网安备 33010602011771号