python3 -- 堆(heapq)

Posted Gump Yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 -- 堆(heapq)相关的知识,希望对你有一定的参考价值。

堆是一个二叉树,其中每个父节点的值都小于或等于其所有子节点的值。整个堆的最小元素总是位于二叉树的根节点。

python的heapq模块提供了对堆的支持。这个模块实现的是小顶堆

堆数据结构最重要的特征是heap[0]永远是最小的元素

1.heapq.heappush(heap,item)

 注:heap为定义堆,item增加的元素

 

 2.heapq.heapify(list)

将列表转换为堆

 3.heapq.heappop(heap)

函数heappop弹出最小的元素(总是位于索引0处),并确保剩余元素中最小的那个位于索引0处(保持堆特征)。虽然弹出列表中第一个元素的效率通常不是很高,但这不是问题,因为heappop会在幕后做些巧妙的移位操作。

注:删除最小值,因为堆的特征是heap[0]永远是最小的元素,所以一般都是删除第一个元素。

 4.heapq.heapreplace(heap.item)

注:删除最小元素值,添加新的元素值

5.heapq.nlargest(n,heap)

注:查询堆中的最大元素,n表示查询元素个数

 6.heapq.nsmallest(n,heap)

注:查询堆中的最小元素,n表示查询元素的个数

leetcode练习题:

解题思路
题目为最小的K个数,最容易想到的是直接堆化整个数据,使用最小堆,然后pop出K个元素即可。但这样时间复杂度会略高。
所以使用最大堆,先用前K个元素堆化,然后后面元素依次进堆比较堆顶元素,如果比堆顶小,则保留,这样会留下最小的K个元素。

关于解答中为什么会把元素变成负数,这样就能够把小顶堆变成大顶堆了

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        if k == 0:
            return list()
        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

  

 https://blog.csdn.net/u013206202/article/details/78968438

以上是关于python3 -- 堆(heapq)的主要内容,如果未能解决你的问题,请参考以下文章

heapq模块

python 的内置模块堆 heapq

Python标准库模块之heapq

Python库,heapq中的“q”代表啥?

常用的标准模块5(heapq)

python使用heapq快速查找最大或最小的 N 个元素