グラフアルゴリズム

ノードとエッジで構成されるグラフ構造に対する探索・最短経路・接続性の分析アルゴリズム

アルゴリズムデータ構造

グラフアルゴリズムとは

グラフアルゴリズムは、ノード (頂点) とエッジ (辺) で構成されるグラフ構造に対する探索、最短経路、接続性の分析を行うアルゴリズムである。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 の違いを以下にまとめる。

観点BFSDFS
データ構造キュースタック (再帰)
最短経路✅ (重みなし)
メモリ多い (幅が広い場合)少ない
用途最短経路、レベル探索経路探索、トポロジカルソート

トポロジカルソート

DAG のノードを依存関係の順序に並べる。ビルドシステム (Turborepo, Nx) で使われる。

依存関係: AB, AC, BD, CD
トポロジカルソート: A, B, C, D (or A, C, B, D)
ビルド順序: DB, C (並列) → A

実務での利用

実務での利用を以下にまとめる。

場面アルゴリズム
npm の依存解決トポロジカルソート
ネットワークルーティングダイクストラ (最短経路)
SNS のフォロー推薦BFS (共通の友達)
循環依存の検出DFS (バックエッジの検出)
マイクロサービスの依存分析DAG の可視化

Neptune (AWS のグラフ DB)

大規模なグラフデータ (SNS、不正検知) には Amazon Neptune を使う。Gremlin または SPARQL でクエリする。

グラフアルゴリズムの関連書籍も参考になる。

この記事は役に立ちましたか?

関連用語

関連する記事