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
posted @ 2022-10-13 17:31  酷酷的排球  阅读(97)  评论(0编辑  收藏  举报