プリム法とクラスカル法の違いを徹底解説!最小全域木(MST)アルゴリズムの比較
はじめに
本記事では、グラフ理論における代表的なアルゴリズムであるプリム法(Prim's Algorithm)とクラスカル法(Kruskal's Algorithm)の違いについて詳しく解説します。どちらも最小全域木(Minimum Spanning Tree:MST)を求めるための貪欲法(グリーディアルゴリズム)ですが、アプローチや特性が大きく異なります。
前提知識:最小全域木(MST)とは
- 連結かつ無向のグラフが与えられたとき、全域木(スパニングツリー)とは、そのグラフのすべての頂点を接続する木構造の部分グラフを指します。
- 1つのグラフから複数の全域木が作られる可能性があります。
- 最小全域木(MST)とは、重み付き連結無向グラフにおいて、他のどの全域木よりも重みが小さい(または等しい)全域木のことです。
- 全域木の重みは、その木に含まれるすべての辺の重みを合計したものとして定義されます。
クラスカル法(Kruskal's Algorithm)とは
クラスカル法は、辺を基準に最小全域木を構築していく貪欲法アルゴリズムです。
主な特徴
- 最小の重みを持つ辺から木を構築していきます。
- 各ノードは一度だけ走査されます。
- 疎なグラフ(辺の数が少ないグラフ)で高速に動作します。
- 時間計算量は
O(E log V)(V:頂点数、E:辺数)です。 - 非連結のグラフ(分断された成分を含むグラフ)にも適用できます。
クラスカル法によるMSTの求め方
- すべての辺を重みの昇順にソートします。
- 最も重みの小さい辺を選択します。
- その辺が、それまでに構築した全域木とともにサイクル(閉路)を形成しないか確認します。
- サイクルが形成されない場合は、その辺を採用します。
- サイクルが形成される場合は、その辺を破棄します。
- 全域木の辺の数が V−1 個になるまで、手順2〜5を繰り返します。
プリム法(Prim's Algorithm)とは
プリム法は、頂点を基準に最小全域木を一つずつ成長させていく貪欲法アルゴリズムです。クラスカル法と同様に貪欲法に分類されます。
主な特徴
- 空の全域木から開始し、2つの頂点集合を管理します。
- 片方の集合にはすでにMSTに含まれた頂点を、もう片方には未追加の頂点を格納します。
- 各ステップで、2つの集合を結ぶすべての辺を検討し、その中で最も重みの小さい辺を選択します。
- 選ばれた辺のもう一方の端点を、MST側の集合へ移動させます。
- MSTはグラフ内の任意の頂点から構築を開始できます。
- 最小距離の値を更新するため、同じノードを複数回訪問する場合があります。
- 時間計算量は
O(V²)(V:頂点数)です。フィボナッチヒープを使用することでO(E + V log V)まで改善できます。 - 密なグラフ(辺の数が多いグラフ)で高速に動作します。
- 連結グラフのみに対応しており、非連結グラフでは使用できません。
プリム法によるMSTの求め方
- MSTにすでに含まれている頂点を記録するための集合
mstSetを作成します。 - 入力グラフのすべての頂点にキー値(key value)を割り当てます。
- 初期状態では、すべてのキー値を「∞(INFINITE)」に設定します。
- 最初に選ばれるよう、開始頂点のキー値のみ「0」を設定します。
mstSetがすべての頂点を含むまで、以下の手順を繰り返します。mstSetに含まれず、かつキー値が最小である頂点 u を選択します。- 頂点 u を
mstSetに追加します。 - u のすべての隣接頂点を反復処理し、キー値を更新します。
- 隣接頂点 v ごとに、辺 u–v の重みが v の現在のキー値より小さい場合は、v のキー値をその重みに更新します。
プリム法とクラスカル法の比較まとめ
| 項目 | クラスカル法 | プリム法 |
|---|---|---|
| アプローチ | 辺ベース | 頂点ベース |
| 時間計算量 | O(E log V) | O(V²)(ヒープ改善で O(E + V log V)) |
| 向いているグラフ | 疎なグラフ | 密なグラフ |
| 開始点 | 最小重みの辺 | 任意の頂点 |
| 非連結グラフへの対応 | 可能 | 不可(連結グラフのみ) |
| サイクル判定 | 必要 | 不要 |
まとめ
クラスカル法は「辺」に着目して全体をソートしながら構築するのに対し、プリム法は「頂点」に着目して木を一つずつ成長させます。疎なグラフならクラスカル法、密なグラフならプリム法が適しています。グラフの性質や要件に応じて、両者を上手く使い分けることが重要です。
-
アルゴリズムとフローチャートの違いとは?特徴と具体例を徹底解説
プログラミングやシステム設計の現場でよく耳にする「アルゴリズム」と「フローチャート」。どちらも問題解決に欠かせない重要な概念ですが、それぞれの役割や特性は大きく異なります。この記事では、両者の違いを具体例とともにわかりやすく解説します。 アルゴリズムとは アルゴリズムとは、明確に定義された手順の連なりとして定義されます。これらの手順は、目の前の問題を解決するための方法を提供するものであり、処理が段階的に定義された、体系的かつ論理的なアプローチです。 主な特徴 特定の問題に対する解決策を提示する。 解決策は機械語に変換され、システムが実行することで適切な出力が得られる。 多くの単純な操作を組み
-
BFSとDFSの違いとは?グラフ探索アルゴリズムの特徴と使い分けを徹底解説
BFS(幅優先探索)とDFS(深さ優先探索)は、どちらもグラフ構造上の頂点を訪問するための基本的なグラフ探索アルゴリズムです。一見似ていますが、探索の進め方や内部で利用するデータ構造が異なるため、それぞれ得意な場面が変わってきます。BFSとは幅優先探索(Breadth First Search:BFS)は、開始地点から近い頂点を順に、横方向へ広がるようにグラフを探索するアルゴリズムです。キュー(Queue:先入れ先出し方式)を使用しており、探索中に行き止まりに到達した場合でも、キューに記憶された次の頂点から探索を再開できます。DFSとは深さ優先探索(Depth First Search:DFS