本文是解读heapq源码的初始章节,主要目的是介绍heapq这个库的基本使用方法。
(原文地址:https://docs.python.org/3/library/heapq.html#basic-examples)
这个库提供一个堆的算法实现,也称为优先队列算法。
(这里使用的堆都是小根堆,也成为小顶堆)堆是二叉树,其每个父节点的值都小于或等于其任何子节点。为了方便比较,不存在的元素
都默认是无限大的。
使用一个空列表来创建一个堆,或是使用heapify()来将一个非空列表转换为堆。
heapq.heappush可以将值添加到heap中去。
Example:
import heapq
array = [1,3,5,2,4]
heap = []
for num in array:
heapq.heappush(heap,num)
print("array:", array)
print("heap: ", heap)
输出的结果
array: [1, 3, 5, 2, 4]
heap: [1, 2, 5, 3, 4]
将堆顶元素删除,如果堆为空,则会引发IndexError。返回删除的值。
Example:
x = heapq.heappop(heap)
print("heap:",heap)
print("x:",x)
Result:
heap: [2, 3, 5, 4]
x: 1
这是一套组合拳,将item
添加到heap
中去,然后将堆顶的元素删除,并返回这个被删除的值。
Example:
x = heapq.heappushpop(heap,6)
print("heap:",heap)
print("x:",x)
Result:
heap: [2, 3, 5, 6, 4]
x: 1
在线性时间内将列表转换成堆。
Example:
heapq.heapify(array)
print("array:", array)
Result:
array: [1, 2, 5, 3, 4]
删除掉堆顶的元素,然后将新元素添加到堆中去。如果堆是空的,则会引发IndexError。
Example:
x = heapq.heapreplace(heap,7)
print("heap:",heap)
print("x:",x)
empty = []
heapq.heapify(empty)
heapq.heappushpop(empty,1)
print("empty: ",empty)
heapq.heapreplace(empty,1)
print("empty:",empty)
Result:
heap: [3, 4, 5, 6, 7]
x: 2
empty: []
Traceback (most recent call last):
File "D:/Github/刷题心得/刷题心得指南/Source Code Project/heapq/heapqTest.py", line 25, in
heapq.heapreplace(empty,1)
IndexError: index out of range
返回数据集中最大的n个元素组成的列表。
Example:
print("nlargest:",heapq.nlargest(3,heap))
Result:
nlargest: [5, 4, 3]
返回数据集中最大的n个元素组成的列表。
Example:
print("nsmallest:",heapq.nsmallest(3,heap))
Result;
nsmallest: [1, 2, 3]