私は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:これは問題の一部です。最大値を見つけて、いくつかの要素に分割し、ヒープに戻します。
ドキュメント は言う、
私たちの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)
があります。
PriorityQueue
オブジェクトを使用しないのはなぜですか? (priority,key)
タプル。最大ヒープを作成する1つの簡単な解決策は、priority
をkey
の反対にすることです。
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