グラフアルゴリズム
ノードとエッジで構成されるグラフ構造に対する探索 / 最短経路 / 接続性の分析アルゴリズム
グラフアルゴリズムとは
グラフアルゴリズムは、ノード (頂点) とエッジ (辺) で構成されるグラフ構造に対する探索、最短経路、接続性の分析を行うアルゴリズムである。SNS のフォロー関係、ネットワークのルーティング、依存関係の解析で使われる。
グラフの種類
グラフの種類を以下にまとめる。
| 種類 | 説明 | 例 |
|---|---|---|
| 無向グラフ | エッジに方向がない | SNS の友達関係 |
| 有向グラフ | エッジに方向がある | フォロー関係、依存関係 |
| 重み付きグラフ | エッジにコスト (重み) がある | 地図の距離 |
| DAG (有向非巡回) | 循環がない有向グラフ | ビルドの依存関係 |
探索アルゴリズム
探索アルゴリズムのコード例を示す。
// BFS (幅優先探索): 最短経路の発見
function bfs(graph: Map<string, string[]>, start: string): string[] {
const visited = new Set<string>();
const queue = [start];
const result: string[] = [];
while (queue.length > 0) {
const node = queue.shift()!;
if (visited.has(node)) continue;
visited.add(node);
result.push(node);
queue.push(...(graph.get(node) || []));
}
return result;
}
// DFS (深さ優先探索): 経路の探索、トポロジカルソート
function dfs(graph: Map<string, string[]>, start: string, visited = new Set<string>()): string[] {
if (visited.has(start)) return [];
visited.add(start);
const result = [start];
for (const neighbor of graph.get(start) || []) {
result.push(...dfs(graph, neighbor, visited));
}
return result;
}
BFS vs DFS
BFS と DFS の違いを以下にまとめる。
| 観点 | BFS | DFS |
|---|---|---|
| データ構造 | キュー | スタック (再帰) |
| 最短経路 | 辺の重みが等しいグラフなら最短経路が得られる | 先に見つかった経路が最短とは限らない |
| メモリ | 多い (幅が広い場合) | 少ない |
| 用途 | 最短経路、レベル探索 | 経路探索、トポロジカルソート |
トポロジカルソート
DAG のノードを依存関係の順序に並べる。ビルドシステム (Turborepo, Nx) で使われる。
依存関係: A → B, A → C, B → D, C → D (矢印は「左が右に依存する」)
トポロジカルソート: A, B, C, D (or A, C, B, D)
ビルド順序: トポロジカル順の逆 = D → B, C (並列) → A
実務での利用
実務での利用を以下にまとめる。
| 場面 | アルゴリズム |
|---|---|
| npm の依存解決 | トポロジカルソート |
| ネットワークルーティング | ダイクストラ (最短経路) |
| SNS のフォロー推薦 | BFS (共通の友達) |
| 循環依存の検出 | DFS (バックエッジの検出) |
| マイクロサービスの依存分析 | DAG の可視化 |
Neptune (AWS のグラフ DB)
大規模なグラフデータ (SNS、不正検知) には Amazon Neptune を使う。クエリ言語はデータモデルで分かれ、プロパティグラフとして持つなら Gremlin または openCypher、RDF として持つなら SPARQL を使う (2026 年 8 月時点)。どのモデルで格納するかでクエリの書き方が変わるため、設計の最初に決める。
グラフアルゴリズムの関連書籍も参考になる。
この記事は役に立ちましたか?
関連用語
木構造
親子関係を持つノードで構成される階層的なデータ構造
二分探索
ソート済み配列を半分ずつ絞り込んで O(log n) で要素を検索するアルゴリズム
動的計画法
問題を部分問題に分割し、結果をメモ化して重複計算を排除するアルゴリズム設計手法
グラフデータベース
ノード (エンティティ) とエッジ (関係) でデータを表現し、複雑な関係性のクエリに特化したデータベース
依存グラフとは - モジュール間の依存関係を可視化する方法
依存グラフはパッケージやモジュール間の依存関係を有向グラフで表現する手法。循環依存の検出 / ビルド順序の決定 / 影響範囲分析での活用法を解説
合意アルゴリズム
分散システムで複数のノードが同じ値に合意するためのアルゴリズム
関連する記事
アルゴリズム本ガイド - 競プロだけじゃない、実務に活きる選び方
アルゴリズム本の 3 タイプと、実務でアルゴリズムの知識が活きる場面、数学が苦手な人向けの学習ルートを紹介します。
ソフトウェア開発の歴史を変えた 5 冊の技術書
アルゴリズムの学問化からコードの可読性革命まで、ソフトウェア開発の方向性を決定づけた 5 冊の技術書を、時代背景とエピソードとともに紹介します。
機械学習 / ディープラーニング本ガイド - エンジニアが読むべき AI 技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルート、ディープラーニング本への進み方、ML 本の賞味期限の見極め方を解説します。