Python——heapq堆队列算法
特点
- 使用了从零开始的索引。这使得节点和其孩子节点索引之间的关系不太直观但更加适合,因为 Python 使用从零开始的索引。
- pop 方法返回最小的项而不是最大的项
创建一个堆
h e a p q . h e a p i f y ( x ) heapq.heapify(x) heapq.heapify(x)
将list x 转换成堆,原地,线性时间内。
加入和弹出
h e a p q . h e a p p u s h ( h e a p , i t e m ) heapq.heappush(heap, item) heapq.heappush(heap,item)
将 item 的值加入 heap 中,保持堆的不变性。
h e a p q . h e a p p o p ( h e a p , i t e m ) heapq.heappop(heap, item) heapq.heappop(heap,item)
弹出并返回 heap 的最小的元素,保持堆的不变性。如果堆为空,抛出 IndexError 。使用 heap[0] ,可以只访问最小的元素而不弹出它。
h e a p q . h e a p p u s h p o p ( h e a p , i t e m ) heapq.heappushpop(heap, item) heapq.heappushpop(heap,item)
将 item 放入堆中,然后弹出并返回 heap 的最小元素。该组合操作比先调用 heappush() 再调用 heappop() 运行起来更有效率。一般题目要求维持堆的大小不变。
h e a p q . h e a p r e p l a c e ( h e a p , i t e m ) heapq.heapreplace(heap, item) heapq.heapreplace(heap,item)
弹出并返回 heap 中最小的一项,同时推入新的 item。 堆的大小不变。 如果堆为空则引发 IndexError。这个单步骤操作比 heappop() 加 heappush() 更高效,并且在使用固定大小的堆时更为适宜。
合并*
h e a p q . m e r g e ( ∗ i t e r a b l e s , k e y = N o n e , r e v e r s e = F a l s e ) heapq.merge(*iterables, key=None, reverse=False) heapq.merge(∗iterables,key=None,reverse=False)
将多个已排序的输入合并为一个已排序的输出(例如,合并来自多个日志文件的带时间戳的条目)。 返回已排序值的 iterator。
最值
h e a p q . n l a r g e s t ( n , i t e r a b l e , k e y = N o n e ) heapq.nlargest(n, iterable, key=None) heapq.nlargest(n,iterable,key=None)
从 iterable 所定义的数据集中返回前 n 个最大元素组成的列表。 如果提供了 key 则其应指定一个单参数的函数,用于从 iterable 的每个元素中提取比较键 (例如 key=str.lower)。 等价于: sorted(iterable, key=key, reverse=True)[:n]。
h e a p q . n s m a l l e s t ( n , i t e r a b l e , k e y = N o n e ) heapq.nsmallest(n, iterable, key=None) heapq.nsmallest(n,iterable,key=None)
从 iterable 所定义的数据集中返回前 n 个最小元素组成的列表。 如果提供了 key 则其应指定一个单参数的函数,用于从 iterable 的每个元素中提取比较键 (例如 key=str.lower)。 等价于: sorted(iterable, key=key)[:n]。