这个模块提供了堆队列算法的实现,也称为优先队列算法
堆是一个二叉树,它的每个父节点的值都只会小于或大于所有孩子节点(的值),他使用了数组来实现。堆最小的元素总是在根节点: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