グラフ表現(隣接行列・隣接リスト)とは?グラフ(点と線のつながり)をコンピュータで表す2つの方法

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

30秒で結論

グラフ表現とは(全体像)

グラフ表現は、「どの点とどの点がつながっているか」をコンピュータの中でどう記録するかの方法のこと。グラフ理論(点と線でつながりを表す数学)を、実際のデータ構造に落とし込む話だ。

代表的なのは2つ。

どちらも同じグラフを表せるが、得意・不得意(メモリと速さのバランス)が違うので、グラフの性質に合わせて選ぶ。


詳しく:行列とリストの使い分けだけ覚えれば戦える

ここが記事の心臓部。2方式を並べて比べる。

隣接行列と隣接リストの違い

隣接行列隣接リスト
持ち方点×点の表(マス目)各点ごとの隣の点リスト
辺の有無の判定速い(一発・O(1))リストをたどる(O(次数))
メモリ多い(O(n²))少ない(O(V+E))
向くグラフ密(線が多い)疎(線が少ない)

いちばん大事なのが、使い分け。隣接行列は「2点がつながっているか」を一発で判定できる反面、点が多いと表が大きくなりすぎる(O(n²))。隣接リストはメモリに優しいが、つながりを調べるにはリストをたどる必要がある。

だから、線が多い密なグラフは隣接行列、線が少ない疎なグラフは隣接リストが向く。SNSの友だち関係のように「点はたくさんあるが線は限られる」場合は疎グラフなので、隣接リストが基本だ。

「どちらも同じで選ぶ必要はない」「いつもリストが上」と思うのは誤りで、グラフの性質で使い分けるのがポイントだ。

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

要するに、グラフ表現は「つながりの持ち方の選び方」だ。

隣接行列 … 全員ぶんの大きな出席表。「AとBは知り合い?」を表の交点で一発確認できるが、人数が多いと表が巨大になる

隣接リスト … 各人が自分の友だちリストだけを持つ。場所を取らないが、「AとBは知り合い?」はAのリストをたどって確認する

つまり、つながりがぎっしり(密)なら表(行列)、まばら(疎)なら友だちリスト(リスト)が向く、というわけだね。


試験のツボ

🔴 一番出る:密なら行列・疎ならリスト

①密なグラフ(線が多い)は隣接行列が向く

②疎なグラフ(線が少ない)は隣接リストが向く

🔴 次に出る:それぞれの得意・不得意

①隣接行列=辺判定が一発(O(1))だがメモリO(n²)

②隣接リスト=メモリO(V+E)で優しいが辺判定はたどる

🟡 押さえると安定:どちらも同じグラフを表せる

①表し方が違うだけで、同じグラフを表現できる

②使い分けはメモリと速さのバランスで決める


よくある間違い

「隣接行列と隣接リストはまったく同じで、選ぶ必要はない」→ ✗  メモリと速さのバランスが違うので、グラフの性質で使い分ける。

「隣接リストはつねに隣接行列より優れている」→ ✗  密なグラフ(線が多い)では隣接行列のほうが有利なことがある。

「隣接行列はメモリが少なくて済む」→ ✗  隣接行列はO(n²)でメモリを多く使う。少ないのは隣接リスト。


試験での出題パターン

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

オリジナル問題1(使い分け)

📝 オリジナル問題 1 グラフ表現の使い分け

グラフ表現の使い分けに関する次の記述のうち、正しいものはどれか。

  1. 線が多い密なグラフは隣接リスト、線が少ない疎なグラフは隣接行列が向く
  2. どんなグラフでも隣接リストが最も優れているので、行列は使う必要がない
  3. 線が多い密なグラフは隣接行列、線が少ない疎なグラフは隣接リストが向く
  4. グラフの性質とは無関係に、表現方法はランダムに選んでよいものである
オーエスペン
オーエスペン 解答・解説

解答は 3 だよ。

線が多い密なグラフは隣接行列、線が少ない疎なグラフは隣接リストが向くんだ。グラフの性質(密か疎か)で使い分けるのがポイントだよ。

選択肢1は行列とリストが逆。選択肢2は「いつもリストが上」が誤り。選択肢4は「ランダムに選ぶ」が誤りだよ。

選択肢判定理由
1行列とリストが逆
2密グラフは行列が有利
3密は行列・疎はリスト
4性質で使い分ける

オリジナル問題2(隣接行列の特徴)

📝 オリジナル問題 2 隣接行列の特徴

隣接行列に関する次の記述のうち、正しいものはどれか。

  1. 辺の有無を一発で判定できるが、メモリをO(n²)と多く使う表現である
  2. 辺の有無は判定できないが、メモリをほとんど使わない表現のことである
  3. メモリをO(V+E)しか使わず、疎なグラフに最も向いている表現である
  4. 各点が自分の隣の点のリストを持つ、メモリに優しい表現のことである
オーエスペン
オーエスペン 解答・解説

解答は 1 だよ。

隣接行列は辺の有無を一発で判定できる(O(1))けれど、メモリをO(n²)と多く使うんだ。だから線が多い密なグラフに向いているよ。

選択肢2は「判定できない」が誤り。選択肢3・4は隣接リストの説明だよ。

選択肢判定理由
1一発判定だがメモリO(n²)
2辺判定はできる
3それは隣接リスト
4それは隣接リスト

オリジナル問題3(隣接リストの特徴)

📝 オリジナル問題 3 隣接リストの特徴

隣接リストに関する次の記述のうち、正しいものはどれか。

  1. 点×点の表で持つため、メモリをO(n²)と多く使う表現のことである
  2. グラフを表現できず、つながりを記録することはできない方法である
  3. すべてのグラフで隣接行列より必ず遅く、使う意味がない表現である
  4. 各点が隣の点のリストを持ち、メモリO(V+E)で疎なグラフに向く
オーエスペン
オーエスペン 解答・解説

解答は 4 だよ。

隣接リストは各点が「隣の点のリスト」を持ち、メモリはO(V+E)で優しいんだ。だから線が少ない疎なグラフ(SNSの友だち関係など)に向いているよ。

選択肢1は「点×点の表・O(n²)」で隣接行列の説明。選択肢2は「表現できない」が誤り。選択肢3は「必ず遅い・使う意味がない」が誤りだよ。

選択肢判定理由
1それは隣接行列
2グラフを表現できる
3疎グラフでは有利
4隣の点リスト・O(V+E)で疎グラフ向き

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

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

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

App Storeで見る