【ゆうせんどきゅー】

優先度キュー とは?

最終更新:
💡 行列に並んでも、VIPは先に通される特別なキュー

追加した順ではなく、決めた優先度の規則に従って要素を取り出すデータ構造。数値の小さいものを優先するか、大きいものを優先するかなどは、比較規則や実装によって変わる。

📌 このページのポイント
追加した順? 優先度の順? 追加順:A → B → C 通常のキュー A 低 B 高 C 中 A B C 追加順で取り出す 優先度キュー A 低 B 高 C 中 B C A 優先度で取り出す 優先度の規則:高 → 中 → 低(例) 下段は取り出す順。内部の並びとは別
Aは低、Bは高、Cは中という優先度の例です。通常のキューは追加順、優先度キューは指定した比較規則で取り出します。同じ優先度の順番は実装に依存します。
ひよこ ひよこ
優先度キューって普通のキューと何が違うの?
ペンギン先生 ペンギン先生
普通のキューは先入れ先出し(FIFO)で、追加した順に取り出すよ。優先度キューは、決めた優先度の規則で次を選ぶ。たとえばA、B、Cの順に追加しても、Bの優先度が最も高ければBから取り出せるんだ。
ひよこ ひよこ
優先度は数字が大きいほど高いの?
ペンギン先生 ペンギン先生
規則によるよ。Pythonのheapqの通常の操作は最小値を先に取り出し、JavaのPriorityQueueも自然順序や指定した比較規則で最小となる要素を先頭にする。内部に二分ヒープを使う場合、追加や先頭の取り出しはO(log n)だよ。これは要素数に対する増え方の目安で、「1000個なら必ず10回比較」という意味ではないんだ。
ひよこ ひよこ
具体的にはどんな場面で使うの?
ペンギン先生 ペンギン先生
優先して処理するタスクを選んだり、シミュレーションで次に起きるイベントを予定時刻順に取り出したりするよ。負の重みがないグラフの最短経路を求めるダイクストラ法でも、現在の距離が最小の候補を選ぶ実装に使う。すべてのOSやカーナビが同じ実装を使う、というわけではないんだ。
ひよこ ひよこ
プログラミングでは中身を順番に見ればいい?
ペンギン先生 ペンギン先生
Pythonのheapqなら、リストにヒープの規則を保って追加・取り出しを行うよ。JavaならPriorityQueueに要素を追加し、pollで取り出せる。ただし内部配列やイテレーターが取り出し順に全部並んでいるとは限らない。Javaのcontainsなど、途中の要素を探す操作にはO(n)かかるものもあるんだ。
ひよこ ひよこ
同じ優先度のものや、優先度を変えたいときは?
ペンギン先生 ペンギン先生
同じ優先度で追加順が保たれるかは実装によるよ。JavaのPriorityQueueでは同順位の順番は保証されないので、順番が必要なら連番などを比較規則に加える。追加済みの要素の優先度だけを書き換えるとヒープの規則を壊すことがあるため、削除して入れ直すなど、使う実装に合った更新方法を選ぼう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「優先度キュー」って出てきたら「決めた優先度の規則で、次の要素を取り出す仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Priority Queue」 = 優先度付きキュー
💬 Priorityは優先度、Queueは待ち行列のこと。先に入れたものより、決めた規則で優先されるものを先に取り出す仕組みだよ。

参考資料

← 用語集にもどる