Python堆队列算法

Posted by AspenStars on June 30, 2020

本文参考了Python的官方文档,主要是对常用方法进行分析,并对注意事项进行记录

heapq - 堆队列算法

这是python自带的库函数,实际上是最小堆,使用列表实现,堆顶元素为列表的第一个元素(最小元素)

从零开始计数,对于所有的 k ,都有 heap[k] <= heap[2*k+1]heap[k] <= heap[2*k+2]。 为了便于比较,不存在的元素被认为是无限大。 最小的元素总是在根结点:heap[0]

函数

heap = []

  • heapq.heappush(heap, item)
    • item 的值加入 heap 中,保持堆的不变性。
  • heapq.heappop(heap)
    • 弹出并返回 heap 的最小的元素,保持堆的不变性。如果堆为空,抛出 IndexError
    • 使用 heap[0] ,可以只访问最小的元素而不弹出它。
  • heapq.heappushpop(heap, item)
    • 这个函数是先推入再弹出
    • item 放入堆中,然后弹出并返回 heap 的最小元素。
    • 保证堆大小不变
    • 该组合操作比先调用 heappush() 再调用 heappop() 运行起来更有效率。
  • heapq.heapreplace(heap, item)
    • 这个函数是先弹出再推入返回的值可能会比添加的 item 更大
    • 弹出并返回 heap 中最小的一项,同时推入新的 item。 堆的大小不变。 如果堆为空则引发 IndexError。
    • 比 heappop() 加 heappush() 更高效,并且在使用固定大小的堆时更为适宜。 pop/push 组合总是会从堆中返回一个元素并将其替换为 item。
  • heapq.heapify(x)
    • 将 list x 转换成堆,原地,线性时间内。
  • heapq.nlargest(n, iterable, key=None)
    • 从 iterable 所定义的数据集中返回前 n 个最大元素组成的列表。
  • heapq.nsmallest(n, iterable, key=None)
    • 从 iterable 所定义的数据集中返回前 n 个最小元素组成的列表。

Leetcode 215

数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        if k > len(nums):
            raise Exception("Error")
        L = []
        for i in range(k):
            heapq.heappush(L, nums[i])
        
        for i in range(k, len(nums)):
            if L[0] < nums[i]:
                heapq.heappushpop(L, nums[i])
        return L[0]