web-dev-qa-db-ja.com

pythonで最大ヒープを取得する方法

私はPythonでheapqモジュールを使用していますが、reverse = Trueを使用しても、最小ヒープしか使用できないことがわかります

私はまだ最小トップヒープを取得します

from heapq import *

h=[]
merge(h,key=lambda e:e[0],reverse=True)
heappush(h, (200, 1))
heappush(h, (300,2))
heappush(h, (400,3))
print(heappop(h))

私はまだ結果を得ます:

(200, 1)

結果を得たい:

(400,3)

どうやってするの?

これは最小の要素です。私は最大の気分をポップしたいですか?

pS:これは問題の一部です。最大値を見つけて、いくつかの要素に分割し、ヒープに戻します。

9
user504909

ドキュメント は言う、

私たちのpopメソッドは、最大ではなく最小の項目を返します(教科書では「最小ヒープ」と呼ばれます。「最大ヒープ」は、インプレースソートに適しているため、テキストではより一般的です)。

したがって、最大ヒープを直接取得することはできません。ただし、間接的に取得する1つの方法は、アイテムのnegativeをヒープにプッシュし、アイテムをポップした直後に再びネガティブにすることです。したがって、heappush(h, (200, 1))の代わりにheappush(h, (-200, -1))を実行します。そして、最大アイテムをポップして印刷するには、次を実行します

_negmaxitem = heappop(h)
maxitem = (-negmaxitem[0], -negmaxitem[1])
print(maxitem)
_

ヒープに正確に何を格納しているかによって、同じ効果を得る他の方法があります。

最小ヒープで_h[-1]_を試行しても、最大項目を見つけるのに機能しないことに注意してください。ヒープ定義は、最大項目がリストの最後に来ることを保証しません。 nlargestは機能するはずですが、O(log(n))の時間の複雑さのため、ヒープの目的に反する最小ヒープ内の最大の項目を調べるだけです。私の方法は、最大の項目を調べるために、負のヒープに時間の複雑さO(1)があります。

9
Rory Daulton

PriorityQueueオブジェクトを使用しないのはなぜですか? (priority,key)タプル。最大ヒープを作成する1つの簡単な解決策は、prioritykeyの反対にすることです。

from Queue import PriorityQueue
pq = PriorityQueue()
for i in range(10): # add 0-9 with priority = -key
    pq.put((-i,i))
print(pq.get()[1]) # 9
2
Niema Moshiri