【とぽろじかるそーと】

トポロジカルソート とは?

最終更新:
💡 先に必要なことを守って、順番を作る

有向非巡回グラフの頂点を、各辺の始点が終点より先になるように並べること。作業の前提条件を守る順番を求められ、条件次第では複数の正しい並び方がある。

📌 このページのポイント
先に必要な作業を守って並べる矢印:始点を終えてから終点へABCD前提を守る順序A → B → C → DA → C → B → D も正しいBとCの前後は自由。循環があると並べられない
Aの後にBとC、両方の後にDという例。正しい順番は一つとは限りません。
ひよこ ひよこ
普通のソートと何が違うの?
ペンギン先生 ペンギン先生
数値の大小などではなく、前後の条件を守って並べるよ。図の矢印を「Aを終えてからB」と決めたなら、AをBより先に置く。ライブラリが別のライブラリに依存する、という表現では矢印の向きを逆に描くこともあるので、図の定義を確かめよう。
ひよこ ひよこ
正しい順番は、一つだけ?
ペンギン先生 ペンギン先生
一つとは限らないよ。Aの後にBとC、その両方の後にDなら、A→B→C→DもA→C→B→Dも条件を満たす。BとCの前後は決められていないんだ。必要な前後関係と、自由に選べる順番を分けると分かりやすいね。
ひよこ ひよこ
どうやって、順番を作るの?
ペンギン先生 ペンギン先生
例えば、まだ前提のない頂点を取り出し、それを除いた残りから次を探す方法があるよ。Pythonのgraphlibも、前提が済んで処理できる頂点をget_readyで取り出せる。複数の頂点が準備できたら、処理する順番や並列実行は別に決めるんだ。
ひよこ ひよこ
循環依存があったら?
ペンギン先生 ペンギン先生
Aの前にB、Bの前にAが必要なら、その全体を条件どおりに並べられないよ。PythonではCycleErrorで循環を知らせる。一部に循環があっても、依存していない部分は処理できる場合がある。まず循環を解消する必要がある範囲を確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「トポロジカルソート」って出てきたら「先に必要な作業を守る順番に並べること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Topological Sort」 = 位相的な順序付け
💬 グラフの向きに沿う前後関係を保つ並べ方だよ。名前の由来を推測するより、矢印が何を表すかを確認しよう。

参考資料

← 用語集にもどる