pythonのヒープキューアルゴリズムheapq

公式文書から抜粋します。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')

おすすめ

転載: www.cnblogs.com/xiximayou/p/12411690.html