実際、Pythonの無い独立したスタック型、およびモジュールのスタック操作の唯一のいくつかの関数が含まれています。このモジュールはheapq(qはキューを表す)、小さなトップデフォルト・ヒープと呼ばれています。Pythonは、ヒープ実装のビッグトップではありません。
一般的に使用される機能
機能 | 説明 |
---|---|
heappush(ヒープ、X) | パイルプレス-X |
heappop(ヒープ) | ポップアップスタック最小の要素から(トップ要素) |
([1,2,3])heapify | ヒープを持つ特性のリストを作成します |
heapreplace(ヒープ、X) | 最小の要素(先頭の要素)をポップし、スタックは、xを押下 |
nlargest(N、ITER) | ITERは、nで最大の要素を返します。 |
nsmallest(N、ITER) | ITERは、n個の最小要素を返します |
heappopは(常にインデックス0、\スタックで)最小の要素をポップし、インデックス0(スタック保持機能)で最小の残りの要素ことを保証します。
heapreplaceはその後heappushをheappopに等しいが、呼び出しは速くそれらよりでした。
スタック動作時間複雑度は、次の実装のヒープである:バイナリヒープ、フィボナッチヒープ、フィボナッチヒープ......厳密、共通モジュールは、「フィボナッチヒープで使用され
コード例:
from heapq import *
class KthLargest:
def __init__(self, k: int, nums: List[int]):
self.k = k
self.q = []
for x in nums:
self.add(x)
def add(self, val: int) -> int:
if len(self.q) < self.k: # 堆没满,加入堆
heappush(self.q, val)
elif val > self.q[0]: # val大于堆顶元素(第K大),踢掉堆顶元素,加入val
heapreplace(self.q, val)
return self.q[0] # 堆顶
import heapq
a = [2,4,1,5,6,3]
heapq.heapify(a)
print(a) # [1, 4, 2, 5, 6, 3]
import heapq
a = [2,4,1,5,6,3]
heapq.heapify(a)
b = heapq.heappop(a)
print(a) # [2, 4, 3, 5, 6]
print(b) # 1