Python模块:heapq堆

这个模块提供了堆队列算法的实现,也称为优先队列算法

堆是一个二叉树,它的每个父节点的值都只会小于或大于所有孩子节点(的值),他使用了数组来实现。堆最小的元素总是在根节点:heap[0]

 

要创建一个堆,可以使用list来初始化为[],或者你可以通过一个函数heapify(),来把一个list转换成堆

定义了以下函数:

1.heapq.heappush(heap.item)

将item的值加入到heap中,保持堆的不变性

 

2.heapq.heappop(heap)

弹出并返回heap的最小的元素,保持堆的不变性,抛出IndexError,使用heap[0],可以只访问最小的元素而不弹出它。

 

3.heapq.heappushpop(heap, item)

将item放入堆中,然后弹出并返回heap的最小元素,该组合操作比先调用heappush(),在调用heappop()运行起来更有效率

 

4.heapq.heapify(x)

将list x转换成堆,原地,线性时间内

 

5.heapq.heapreplace(heap, item)

弹出并返回heap中最小的一项,同时推入新的item。堆的大小不变。如果堆为空,则引发IndexError。

这个单步骤操作比heappop()加heappush()更高效,并且在使用固定大小的堆时更为适宜.pop/push组合总是会从堆中返回一个元素并将其替换为item。

返回的值可能会比添加的item更大,如果不希望如此,可考虑改用heappushpop(),它的push/pop组合会返回两个值较小的那个,将较大的值留在堆中.

 

6.heapq.nlargest(n, iterable, key = None)

从ierable所定义的数据集中返回前n个最大元素组成的列表,如果提供了key则其指定一个单参数的函数,用于从iterable的每个元素中提取比较键(例如key = str.lower),等价于sorted(iterable, key = key, reverse = True)[:n]

7.heapq.nsmallest(n, iterable, key = None)

后两个函数在n值较小的时候性能最好,对于更大的值,使用sorted()函数会更有效率,此外,当n = 1时,使用内置min()和max()函数会更有效率,如果需要重复使用这些函数,请考虑将可迭代对象转为真正的堆。

 

基本实例:(堆排序)

堆排序可以通过将所有值推入堆中,然后每次弹出一个最小值来实现。

import heapq
def heapSort(array):
    l = []
    
    #循环插入进来
    for val in array:
        heapq.heappush(l, val)
    
    #每次弹出最小值 
    return [heapq.heappop(l) for i in range(l)]
    

 

例题:寻找第K大

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

测试样例:
[1,3,5,2,2],5,3
返回:2
# -*- coding:utf-8 -*-

class Finder:
    def findKth(self, a, n, K):
        # write code here
        import heapq
        l = []
        for val in a:
            heapq.heappush(l, val)
        
        count = 1 
        while heapq:
            pop_num = heapq.heappop(l)
            
            if (count == len(a) - K + 1):
                return pop_num
            count += 1 
            

 

posted @ 2020-08-30 00:40  风不再来  阅读(439)  评论(0编辑  收藏  举报