Python的heapq模块实现了一个适用于Python列表的最小堆算法。
堆是一种树形数据结构,其中子节点与父节点之间是一种有序关系。最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点。heapq模块实现的是一个最小堆。
创建堆
创建堆有两种方式
方法一:使用heappush
1 | In [18]: import heapq |
方法二:使用heapify
如果数据已经存在于内存中,使用heapify
原地重新组织列表中的元素会更加高效
1 | In [24]: import heapq |
还有一种merge()
方法,可以从多个可迭代对象中创建一个堆,相当于
1 | In [27]: import itertools |
访问堆内容
创建好堆之后,可以使用heappop()
删除最小值的元素
1 | In [29]: import heapq |
如果希望在一个操作中删除现有最小元素并替换成新值,可以使用heapreplace()
1 | In [33]: import heapq |
堆的数据极值
heapq还包含两个检查可迭代对象的函数,查找其中包含的最大值与最小值范围。
1 | In [38]: import heapq |
只有在n值比较小的情况下 nlargest 和 nsmallest 才比较高效
这两个函数还接受一个关键字参数key,用于更加复杂的数据结构中
1 | In [44]: portfolio = [ |
其他有趣的方法
1 | # 定义一个 list |
heapq.heappushpop(heap, item)
是上述heappush和heappop的合体,同时完成两者的功能.注意:相当于先操作了heappush(heap,item),然后操作heappop(heap)
1 | In [13]: heapq.heappushpop(h, 3) |
实战
实现堆排序
1 | In [50]: from heapq import * |
由于堆中的元素可以为元组。所以可以对带有权值的元素进行排序
1 | In [53]: from heapq import * |