实际上,Python没有独立的堆类型,而只有一个包含一些堆操作函数的模块。这个模块名为heapq(其中的q表示队列),默认为小顶堆。Python中没有大顶堆的实现。
常用的函数
| 函 数 | 描 述 | 
|---|---|
| heappush(heap, x) | 将x压入堆中 | 
| heappop(heap) | 从堆中弹出最小的元素(栈顶元素) | 
| heapify([1,2,3]) | 让列表具备堆特征 | 
| heapreplace(heap, x) | 弹出最小的元素(栈顶元素),并将x压入堆中 | 
| nlargest(n, iter) | 返回iter中n个最大的元素 | 
| nsmallest(n, iter) | 返回iter中n个最小的元素 | 
heappop弹出最小的元素(总是位于索引0处\栈顶),并确保剩余元素中最小的那个位于索引0处(保持堆特征)。
heapreplace等于先heappop再heappush,但是比分别调用二者快。
堆操作的时间复杂度,下面是堆的实现方法:二叉堆、斐波那契堆、严格斐波那契堆……,常见模块里用的是斐波那契堆》

代码示例:
from heapq import *
class KthLargest:
    def __init__(self, k: int, nums: List[int]):
        self.k = k
        self.q = []
        for x in nums:
            self.add(x)
    def add(self, val: int) -> int:
        if len(self.q) < self.k:        # 堆没满,加入堆
            heappush(self.q, val)
        elif val > self.q[0]:           # val大于堆顶元素(第K大),踢掉堆顶元素,加入val
            heapreplace(self.q, val)
        return self.q[0]                # 堆顶import heapq
a = [2,4,1,5,6,3]
heapq.heapify(a)
print(a)       # [1, 4, 2, 5, 6, 3]import heapq
a = [2,4,1,5,6,3]
heapq.heapify(a)
b = heapq.heappop(a)
print(a)      # [2, 4, 3, 5, 6]
print(b)      # 1原文:https://www.cnblogs.com/ldy-miss/p/11984691.html