Python标准库系列文章目录
python内建模块
collections 模块:deque双向队列
queue module:队列、优先级队列
sortedcontainers:有序列表、有序字典和有序集合
前言
堆是什么?
Python中的堆
一、堆是什么?
堆是一个完全二叉树,它的每个父节点的值都只会小于或等于所有孩子节点(的值)。 它使用了数组来实现:从零开始计数,对于所有的 k ,都有 heap[k] <= heap[2\*k+1]
和heap[k] <= heap[2\*k+2]
。 为了便于比较,不存在的元素被认为是无限大。 堆最有趣的特性在于最小的元素总是在根结点:heap[0] (小顶堆,大顶堆则相反)。
![]() |
![]() |
二、heapq Methods
import heapq
heapq.heapify(x) | 将list x 转换成堆,原地,线性时间内 |
heapq.heappush(heap, item) | 将item推入到堆heap中 |
heapq.heappop(heap) | 弹出并返回 heap 的最小的元素(弹出堆顶元素),保持堆的不变性。如果堆为空,抛出 IndexError 。使用 heap[0] ,可以只访问最小的元素而不弹出它 |
— | — |
heapq.heappushpop(heap, item) | 将 item 放入堆中,然后弹出并返回 heap 的最小元素。该组合操作比先调用 heappush() 再调用 heappop() 运行起来更有效率 |
heapq.heapreplace(heap, item) | 弹出并返回 heap 中最小的一项,同时推入新的 item。 堆的大小不变。 如果堆为空则引发 IndexError。 这个单步骤操作比 heappop() 加 heappush() 更高效,并且在使用固定大小的堆时更为适宜。 pop/push 组合总是会从堆中返回一个元素并将其替换为 item。 返回的值可能会比添加的 item 更大。 如果不希望如此,可考虑改用 heappushpop()。 它的 push/pop 组合会返回两个值中较小的一个,将较大的值留在堆中。 |
heap = [6,8,9,4,3,1,4,6,8]
heapq.heapify(heap) # 将列表变为堆的顺序,默认是 小顶堆
print(heap) #[1, 3, 4, 4, 8, 9, 6, 6, 8] heap的类型依然是list
heapq.heappush(heap, 0)
heapq.heappop(heap)
总结
介绍了Python中的heapq