2016-04-26 4 views
1

単純なヒープがリストのリストとして定義されています。私はheapopheapqモジュールを使用して、最小のキー(暗黙のうちに内部リストの最初の要素であることがわかった)を使ってリストを抽出しました。しかし、以下のケースでは、ポップ作戦が珍しい結果を出すようです。ヒープップの異常な結果ですか?

誰かが理由を説明できますか?

ヒープ= [0、0、0]、[INF、1、1]、[INF、2、2]、[5]、[3,3]、[INF、4,4]

heapq.heappop(ヒープ)

[0,0,0]

heapq.heappop(ヒープ)

[INF、1、1]

heapq.heappop(ヒープ)

[5,3、3]

heapq.heappop(ヒープ)

[INF、2,2]

heapq.heappop(ヒープ)

[INF、4、4]

答えて

4

問題は、ヒープではないリストにheapq使用していることです。 documentationについて議論がheapifyコマンドを使用して、それが実際に動作します:

>>> import heapq 
>>> from numpy import inf 
>>> heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]] 
>>> heapq.heapify(heap) 
>>> heap 
[[0, 0, 0], [5, 3, 3], [inf, 2, 2], [inf, 1, 1], [inf, 4, 4]] 
>>> heapq.heappop(heap) 
[0, 0, 0] 
>>> heapq.heappop(heap) 
[5, 3, 3] 
>>> heapq.heappop(heap) 
[inf, 1, 1] 
>>> heapq.heappop(heap) 
[inf, 2, 2] 
>>> heapq.heappop(heap) 
[inf, 4, 4] 
+0

何いくつかの操作を実行している間、私はいくつかの値にinfファイルを変更した場合は?私は再びheapifyを実行する必要がありますか? – Janmajay

+0

注文を変更する可能性がある場合は、再度heapifyする必要があります。それは魔法ではなく、標準化されたソートアルゴリズムです。 1つの選択肢は、変更したいリストをヒープアウトして新しいリストに追加することです。リストをヒープとして保持する場合は、ヒープ操作を使用して変更する必要があります –

+0

heapq.heapreplaceは、ポップとプッシュの両方を同時に行うことができる機能です –

関連する問題