heapq — 堆队列算法

源代码: Lib/heapq.py


This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm.

Heaps are binary trees for which every parent node has a value less than or equal to any of its children. We refer to this condition as the heap invariant.

This implementation uses arrays for which heap[k] <= heap[2*k+1] and heap[k] <= heap[2*k+2] for all k , counting elements from zero. For the sake of comparison, non-existing elements are considered to be infinite. The interesting property of a heap is that its smallest element is always the root, heap[0] .

The API below differs from textbook heap algorithms in two aspects: (a) We use zero-based indexing. This makes the relationship between the index for a node and the indexes for its children slightly less obvious, but is more suitable since Python uses zero-based indexing. (b) Our pop method returns the smallest item, not the largest (called a “min heap” in textbooks; a “max heap” is more common in texts because of its suitability for in-place sorting).

These two make it possible to view the heap as a regular Python list without surprises: heap[0] is the smallest item, and heap.sort() maintains the heap invariant!

To create a heap, use a list initialized to [] , or you can transform a populated list into a heap via function heapify() .

提供下列函数:

heapq. heappush ( heap , item )

Push the value item onto the heap , maintaining the heap invariant.

heapq. heappop ( heap )

Pop and return the smallest item from the heap , maintaining the heap invariant. If the heap is empty, IndexError is raised. To access the smallest item without popping it, use heap[0] .

heapq. heappushpop ( heap , item )

Push item on the heap, then pop and return the smallest item from the heap . The combined action runs more efficiently than heappush() followed by a separate call to heappop() .

heapq. heapify ( x )

Transform list x into a heap, in-place, in linear time.

heapq. heapreplace ( heap , item )

Pop and return the smallest item from the heap , and also push the new item . The heap size doesn’t change. If the heap is empty, IndexError 被引发。

This one step operation is more efficient than a heappop() followed by heappush() and can be more appropriate when using a fixed-size heap. The pop/push combination always returns an element from the heap and replaces it with item .

The value returned may be larger than the item added. If that isn’t desired, consider using heappushpop() instead. Its push/pop combination returns the smaller of the two values, leaving the larger value on the heap.

The module also offers three general purpose functions based on heaps.

heapq. merge ( * iterables , key = None , reverse = False )

Merge multiple sorted inputs into a single sorted output (for example, merge timestamped entries from multiple log files). Returns an iterator over the sorted values.

类似于 sorted(itertools.chain(*iterables)) but returns an iterable, does not pull the data into memory all at once, and assumes that each of the input streams is already sorted (smallest to largest).

拥有 2 个可选自变量,就必须指定关键词自变量。

key 指定 关键函数 of one argument that is used to extract a comparison key from each input element. The default value is None (直接比较元素)。

reverse 是布尔值。若设为 True , then the input elements are merged as if each comparison were reversed. To achieve behavior similar to sorted(itertools.chain(*iterables), reverse=True) , all iterables must be sorted from largest to smallest.

3.5 版改变: 添加可选 key and reverse 参数。