python heapq 堆模块
python heapq模块
引言
堆
堆(heapq): 一类特殊数据结构,通常是一个可以被看做一棵树的数组对象。
堆的性质:
- 堆中某个节点的值,总是不大于或不小于其父节点的值;
- 堆总是一颗完全二叉树。
堆分类:
将根节点最大的堆叫做最大堆或大顶堆,根节点最小的堆叫做最小堆或小顶堆。
常见的堆有二叉堆、斐波那契堆等。
堆的定义:
n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)
若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。
由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。
每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
heapq 模块API
# 函数
heappush(heap, x) # 将x压入堆中
heappop(heap) # 从堆中弹出最小的元素
heapify(heap) # 让列表具备堆的特征
heapreplace(heap, x) # 弹出最小元素, 并将x压入堆中
nlargest(n, iter) # 返回iter中最大的元素
nsmallest(n, iter) # 返回iter中最小的元素
eg:
class Solution_40:
def getLeastNumbers(self, arr: List[int], k: int)->List[int]:
"""
使用堆的思想来实现,求整数列表中前k个最小值
"""
import heapq
if k == 0:
return
hp = [-x for x in arr[:k]]
heapq.heapify(hp)
for i in range(k, len(arr)):
if -hp[0] > arr[i]:
heapq.heappop(hp)
heapq.heappush(hp, -arr[i])
ans = [-x for x in hp]
return ans