Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

優先度付きキュー

優先度付きキュー(Priority Queue) は各要素に優先度を持たせ、優先度の高いものから順に取り出せるデータ構造。

通常は ヒープ(Heap) を使って実装される。

操作:

  • push(x): 要素 x を追加する(O(log⁡n)O(\log n))

  • pop(): 最も優先度の高い要素を取り出す(O(log⁡n)O(\log n))

  • peek(): 最も優先度の高い要素を参照する(O(1)O(1))

計算量

ヒープ(二分ヒープ)による実装での各操作の計算量:

操作計算量説明
pushO(log⁡n)O(\log n)末尾に追加後、ヒープ条件を満たすまで親と交換(sift-up)
popO(log⁡n)O(\log n)根を取り出し末尾の要素を根に移動後、再構築(sift-down)
peekO(1)O(1)根(先頭要素)を参照するだけ
heapifyO(n)O(n)既存のリストをヒープに変換

他のデータ構造との比較(nn 要素、最小値の取得と削除を繰り返す場合):

データ構造pushpop(最小値)peek(最小値)
ヒープO(log⁡n)O(\log n)O(log⁡n)O(\log n)O(1)O(1)
ソート済み配列O(n)O(n)O(1)O(1)O(1)O(1)
未ソート配列O(1)O(1)O(n)O(n)O(n)O(n)

優先度付きキューは push と pop を繰り返す用途に最適なバランスを持つ。

heapq モジュール

Python の heapq は 最小ヒープ(min-heap) として動作する。最小値が常に先頭に来る。

heapify — O(n)O(n) でリストをヒープ化

リストを一から push で構築すると O(nlog⁡n)O(n \log n) かかるが、heapify は O(n)O(n) で変換できる。

最大ヒープ

heapq は最小ヒープのみサポートするため、最大ヒープとして使うには値を負にする。

タプルによる優先度の指定

(優先度, 値) のタプルを push することで、任意の優先度を指定できる。

queue.PriorityQueue

スレッドセーフな優先度付きキューが必要な場合は queue.PriorityQueue を使う。

活用例:ダイクストラ法

優先度付きキューは最短経路アルゴリズム(ダイクストラ法)で頻繁に使われる。コストの小さいノードから順に探索することで効率よく最短距離を求められる。