TL;DR

DAG の各ノードに順序を付け、どのノードも出力先のノードより前に来るように並べ替えるソートのこと。

仕組み

DAG のすべてのノードを一列に並べ、各辺が「前のノードから後ろのノードへ」向くようにする。並べ替えた後は、辺の向きがすべて一方向にそろう。

Wikipedia によると、DAG なら必ずトポロジカルソートでき、ノード数と辺の数に対して線形時間で求められる。代表的な方法は 2 つある。

  • Kahn の方法(1962 年): 入ってくる辺のないノードを集め、1 つずつ取り出して結果に加え、そのノードから出る辺を消す。入ってくる辺がなくなったノードを新たに集めに加える。最後に辺が残っていれば閉路があり、DAG ではない
  • 深さ優先探索を使う方法: 各ノードから再帰的にたどり、後ろのノードをすべて処理し終えたノードを結果の先頭に加える

例

Wikipedia によると、もともとは PERT によるジョブのスケジューリングの研究から生まれた。計算機科学では、Makefile でのコンパイル順の決定、表計算ソフトでのセルの再計算順の決定、リンカでのシンボルの依存関係の解決などに使われる。

注意点

解は 1 つとは限らない。直接の辺で結ばれていないノードどうしは入れ替えられるので、Kahn の方法でもノードを取り出す順によって別の解が得られる。

関連

出典