目录
python中堆的特征
heapq模块
使用heappush创建堆
将列表转化为最小堆
将元素压入堆
从堆中弹出元素
使用heapplace弹出元素的同时压入新的元素
找出最大或最小的多个元素
堆(heap)是一种特殊的树形结构,通常以完全二叉树的形式进行组织,根节点的值小于等于该节点所有子节点的值。
注意:在python中的heapq默认是最小堆!
特点:
1、可以以任意顺序添加对象
2、可以随时找出最小元素,并执行其他操作(删除等)
3、比使用列表的min方法效率高。
python中没有独立的堆类型,可以使用heapq模块来实现,主要包含6个函数
函数 | 描述 |
heappush(heap,x) | 将x压入堆中 |
heappop(heap) | 从堆出弹出最小的元素 |
heapify(heap) | 让列表转换为堆 |
heapplace(heap,x) | 弹出最小的元素,并将x压入堆 |
nlargest(n,iter) | 返回iter中n个最大的元素 |
nsmallest(n,iter) | 返回iter中n个最小的元素 |
from heapq import *
from random import shuffle
data = list(range(10))
shuffle(data)
print(f'原始数据为:{data}')
heap = []
for n in data:
heappush(heap, n)
print(f'创建的堆为:{heap}')
原始数据为:[1, 5, 2, 0, 9, 7, 3, 4, 8, 6]
创建的堆为:[0, 1, 2, 4, 6, 7, 3, 5, 8, 9]
my_list = [1,2,3,4,5]
shuffle(my_list)
heapify(my_list)
print(my_list)
[1, 2, 4, 5, 3]
heappush(heap,10)
print(heap)
[0, 1, 2, 4, 3, 8, 6, 9, 5, 7, 10]
原始堆为[0, 1, 2, 4, 3, 8, 6, 9, 5, 7, 10]
print(heappop(heap))
print(heappop(heap))
print(heap)
0
1
[2, 4, 3, 6, 5, 7, 8, 10, 9]
print(heapreplace(heap,0))
print(heap)
2
[0, 6, 3, 7, 9, 5, 4, 10, 8]
print(nsmallest(3,heap))
print(nlargest(3,heap))
[0, 3, 4]
[10, 9, 8]