• 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 
                
  • 相关阅读:
    Linux CAT与ECHO命令详解
    查看linux版本信息
    kubernetes(一)
    Chrome不安装插件实现页面长截图
    centos 升级glibc-2.17
    redis修改大key报Argument list too long的解决办法
    mysql打印用户权限的小技巧
    Centos6.5 自带的Python2.6.6 如何安装setuptools和pip
    TCP三次握手过程中涉及的队列知识的学习
    Docker volume权限导致的几个问题
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/13584144.html
Copyright © 2020-2023  润新知