公式文書から抜粋します。https://docs.python.org/zh-cn/3.7/library/heapq.html
このモジュールはまた、プライオリティキューイングアルゴリズムとして知られているヒープキューアルゴリズムの実装を提供します。
ヒープは、バイナリツリーで、その親ノードのそれぞれの値は、すべての子どもたちよりも小さくても大きくなります。それは実装するために配列を使用:すべてゼロから数えて、Kを、 ``ヒープ[K] <=有するヒープ[2 * K + 1] `` と。比較のために、どの要素が無限であると考えられていないがあります。ヒープ最も興味深い機能は、最小の要素がルートに常にあります:。 heap[k] <= heap[2*k+2]
heap[0]
このAPIを実装し、教科書のヒープアルゴリズムは、二つの側面ことを、同じではありません。私たちはインデックスベースのスクラッチを使用する(A)。これは、ノードとその子ノード間の指数関係があまり直感的になりますが、これは、より適切であるので、Pythonは、ゼロベースのインデックスを使用しているため。(B)私たちのポップ方法は、最小要素を返すはなく、最大(これは、教科書では「最小ヒープ」と呼ばれ、それはその場配列にに適しているので、「最大ヒープ」は、教科書でより一般的です)。
これらの二つの側面に基づいて、ネイティブのPythonリストとして見るヒープ驚きは:ながら、最小の要素を表し、ヒープ不変を維持します! heap[0]
heap.sort()
スタックを作成するには、初期化にリストを使用することができます、またはあなたは関数を渡すことができ、リスト杭に変換すること。 []
heapify()
これは、次の関数を定義しています。
-
heapq.
heappush
( ヒープ 、 項目) -
項目付加価値ヒープは、ヒープは不変のままです。
-
heapq.
heappop
( ヒープ ) -
ポップアップと返すヒープヒープ不変を維持し、最小の要素を。スタックが空の場合、投げます。使用すると、あなたはそれをポップだけでなく、最小の要素にアクセスすることができます。
IndexError
heap[0]
-
heapq.
heappushpop
( ヒープ 、 項目) -
項目その後、スタックに、そしてポップに戻り、ヒープの最小要素。複合稼働率は、最初に呼び出された後、呼び出しアップし、より効率的に実行されています。
heappush()
heappop()
-
heapq.
heapify
( X ) -
一覧Xは、その場で、線形時間を山に変換します。
-
heapq.
heapreplace
( ヒープ 、 項目) -
ポップアップと返すヒープ新に押し込みながら、最小のものを項目。同じサイズのヒープ。スタックが空の場合に開始。
IndexError
よりこの1ステップ動作添加固定サイズのスタックを使用することで、より効率的で、より適切。ポップ/プッシュ組成常にスタックから要素を返すとに置き換える項目。
heappop()
heappush()
返される値は、添加より高くてもよい項目大きいです。あなたがそう願っていない場合は、切り替えを検討。そのプッシュ/ポップは、2つの値の組み合わせは、スタックに残さ小さく、大きな値で返します。
heappushpop()
モジュールはまた、三つの一般的な機能ヒープベースの機能を提供します。
-
heapq.
merge
( *iterables, key=None, reverse=False ) -
将多个已排序的输入合并为一个已排序的输出(例如,合并来自多个日志文件的带时间戳的条目)。 返回已排序值的 iterator。
类似于
sorted(itertools.chain(*iterables))
但返回一个可迭代对象,不会一次性地将数据全部放入内存,并假定每个输入流都是已排序的(从小到大)。具有两个可选参数,它们都必须指定为关键字参数。
key 指定带有单个参数的 key function,用于从每个输入元素中提取比较键。 默认值为
None
(直接比较元素)。reverse 为一个布尔值。 如果设为
True
,则输入元素将按比较结果逆序进行合并。 要达成与sorted(itertools.chain(*iterables), reverse=True)
类似的行为,所有可迭代对象必须是已从大到小排序的。在 3.5 版更改: 添加了可选的 key 和 reverse 形参。
-
heapq.
nlargest
( n, iterable, key=None ) -
从 iterable 所定义的数据集中返回前 n 个最大的元素。 如果提供了 key 则其应指定一个单参数的函数,用于从 that is used to extract a comparison key from each element in iterable 的每个元素中提取比较键 (例如
key=str.lower
)。 等价于:sorted(iterable, key=key, reverse=True)[:n]
。
-
heapq.
nsmallest
( n, iterable, key=None ) -
从 iterable 所定义的数据集中返回前 n 个最小元素组成的列表。 如果提供了 key 则其应指定一个单参数的函数,用于从 iterable 的每个元素中提取比较键 (例如
key=str.lower
)。 等价于:sorted(iterable, key=key)[:n]
。
后两个函数在 n 值较小时性能最好。 对于更大的值,使用 sorted()
函数会更有效率。 此外,当 n==1
时,使用内置的 min()
和 max()
函数会更有效率。 如果需要重复使用这些函数,请考虑将可迭代对象转为真正的堆。
基本示例
堆排序 可以通过将所有值推入堆中然后每次弹出一个最小值项来实现。
>>> def heapsort(iterable):
... h = []
... for value in iterable:
... heappush(h, value)
... return [heappop(h) for i in range(len(h))]
...
>>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这类似于 sorted(iterable)
,但与 sorted()
不同的是这个实现是不稳定的。
ヒープの要素はタプルことができます。これは、(例えば、タスク優先度)が割り当てられた比較値に適用される場合、メイン実績:
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')