優先度キュー(ヒープ実装)とは?並んだ順ではなく優先度の高いものから取り出す特別なキュー

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

優先度キューとは(全体像)

優先度キューは、取り出す順番を「優先度」で決めるキューのこと。ふつうのキュー(行列)は「先に並んだ順(FIFO)」で取り出すが、優先度キューはいちばん優先度が高いものから取り出す

身近な例は、病院の救急。受付した順ではなく、重症の人から先に治療する。これが優先度キューの考え方だ。

主な操作は2つ。

並んだ順ではなく優先度順、というのがふつうのキューとの決定的な違いだ。


詳しく:FIFOとの違いとヒープ実装だけ覚えれば戦える

ここが記事の心臓部。まずはふつうのキューとの違い

ふつうのキューと優先度キュー

ふつうのキュー優先度キュー
取り出す順先に入れた順(FIFO)優先度が高い順
イメージお店の行列救急処置(重症から)

ここがいちばん大事。優先度キューはFIFO(先入れ先出し)ではない。並んだ順を無視して、優先度の高いものを先に出す。

次に、実装と速さ

ヒープによる実装

項目内容
標準の実装ヒープ(親が子より大きい/小さい完全二分木)
追加(insert)O(log n)
取り出し(extract)O(log n)

優先度キューはヒープで実装するのが標準。ヒープは根に最大(最小)が来るので、「いちばん優先度が高いものを取り出す」のと相性がよく、追加も取り出しもO(log n)で速い。つまり、ヒープの「根に最優先が来る」性質が、優先度キューにそのまま生きる、というわけだね。

注意点として、「ヒープ=優先度キュー」ではない。ヒープは優先度キューを作るための実装手段の1つで、両者は別の概念だ。用途は、最短経路のダイクストラ法、ゲームAIの**A*探索、OSの処理の優先順位づけ**など。

わかりやすく言い換えると

要するに、優先度キューは「救急の処置室」だ。

ふつうのキュー(FIFO) … 受付した順に呼ぶ(行列と同じ)

優先度キュー … 受付の順ではなく、重症の人から呼ぶ(優先度が高い順)

中のしくみ(実装)にはヒープを使う。ヒープは頂点にいちばん優先度が高いものが来るので、「次に呼ぶ人」をすぐ取り出せる。だから救急のように「緊急度の高い順にさばく」処理が速くできる、というわけだね。


試験のツボ

🔴 一番出る:FIFOとの違い

①優先度キューは優先度が高い順に取り出す

②ふつうのキュー(FIFO・先入れ先出し)とは別もの

🔴 次に出る:ヒープ実装と速さ

①標準の実装はヒープ

②追加・取り出しはO(log n)で速い

🟡 押さえると安定:ヒープとの関係と用途

①ヒープは優先度キューの実装手段の1つ(同じものではない)

②ダイクストラ法・A*探索・処理の優先順位づけに使う


よくある間違い

「優先度キューは先入れ先出し(FIFO)である」→ ✗  優先度キューは優先度の高い順に取り出す。FIFOはふつうのキュー。

「ヒープと優先度キューはまったく同じものである」→ ✗  ヒープは優先度キューを作る実装手段の1つ。両者は別の概念。

「優先度キューの取り出しはO(n)で遅い」→ ✗  ヒープで実装すれば、取り出しはO(log n)で速い。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(FIFOとの違い)

📝 オリジナル問題 1 優先度キューの取り出し順

優先度キューに関する次の記述のうち、正しいものはどれか。

  1. 優先度キューは先に入れた順(FIFO)に取り出す、ふつうのキューと同じものだ
  2. 優先度キューは並んだ順ではなく、優先度が高いものから取り出すキューである
  3. 優先度キューは後に入れた順(LIFO)に取り出す、スタックと同じものである
  4. 優先度キューは取り出す順番がランダムで、毎回どれが出るか分からない
オーエスペン
オーエスペン 解答・解説

解答は 2 だよ。

優先度キューは並んだ順ではなく、優先度が高いものから取り出すんだ。救急処置で重症の人から治療するイメージだね。ふつうのキュー(FIFO)とは別ものだよ。

選択肢1は「FIFOと同じ」が誤り。選択肢3は「LIFO・スタックと同じ」が誤り。選択肢4は「ランダム」が誤りだよ。

選択肢判定理由
1FIFOではなく優先度順
2優先度が高い順に取り出す
3LIFOはスタック
4ランダムではなく優先度順

オリジナル問題2(ヒープ実装)

📝 オリジナル問題 2 優先度キューの実装

優先度キューの実装に関する次の記述のうち、正しいものはどれか。

  1. 優先度キューは並べ替えが必要なので、取り出しは必ずO(n²)で遅くなる
  2. 優先度キューは実装できないため、理論の中だけに存在するものである
  3. 優先度キューはヒープでは実装できず、配列の先頭だけで管理するものだ
  4. 優先度キューはヒープで実装し、追加も取り出しもO(log n)だ
オーエスペン
オーエスペン 解答・解説

解答は 4 だよ。

優先度キューはヒープで実装するのが標準で、追加も取り出しもO(log n)で速いんだ。ヒープは根に優先度が高いものが来るから、相性がいいんだよ。

選択肢1は「O(n²)で遅い」が誤り。選択肢2は「実装できない」が誤り。選択肢3は「ヒープで実装できない」が誤りだよ。

選択肢判定理由
1ヒープでO(log n)
2実装できて広く使われる
3ヒープで実装するのが標準
4ヒープ実装・O(log n)

オリジナル問題3(ヒープとの関係)

📝 オリジナル問題 3 ヒープとの関係と用途

優先度キューとヒープの関係に関する次の記述のうち、正しいものはどれか。

  1. ヒープと優先度キューはまったく同じもので、区別する必要はないものである
  2. 優先度キューはどこにも使われず、実用とは無関係な概念のことである
  3. ヒープは優先度キューを作る実装手段の1つで、ダイクストラ法で使われる
  4. ヒープは優先度キューとは無関係で、優先度キューには使えないものである
オーエスペン
オーエスペン 解答・解説

解答は 3 だよ。

ヒープは優先度キューを作る実装手段の1つで、優先度キューは**ダイクストラ法やA*探索**などで使われるんだ。「ヒープ=優先度キュー」ではない、ってところがポイントだよ。

選択肢1は「まったく同じ」が誤り。選択肢2は「使われない」が誤り。選択肢4は「無関係・使えない」が誤りだよ。

選択肢判定理由
1別の概念(実装と抽象)
2ダイクストラ等で使われる
3ヒープは実装手段・ダイクストラで活躍
4ヒープで実装できる

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る