Topological sort は DAG (directed acyclic graph、有向非環グラフ) の頂点を線形に順序付けし、すべてのエッジ u->v に対して u が v より前 にくるようにします。これは「与えられた依存関係のもとで、これらのタスクをどの順序で実行できるか?」という質問に答えます。
基本的な考え方
2つの一般的なアプローチがあります: (入次数が0のノードを繰り返し削除) または (逆後順序)。有効な順序付けは 存在します。
from collections import deque
def topo_sort(graph):
indeg = {u: 0 for u in graph}
for u in graph:
for v in graph[u]:
indeg[v] += 1 # count incoming edges
queue = deque([u for u in indeg if indeg[u] == 0])
order = []
while queue:
u = queue.popleft()
order.append(u)
for v in graph[u]:
indeg[v] -= 1 # "remove" the edge
if indeg[v] == 0:
queue.append(v)
return order if len(order) == len(graph) else None # None -> cycle
topo_sort({'shirt': ['tie'], 'tie': ['jacket'], 'jacket': []})
# -> ['shirt', 'tie', 'jacket']
ビルドシステム、タスクスケジューリング、コース履修要件、依存関係解決に使用します。結果が V より短い場合、グラフは サイクル を持ちます (有効な順序は存在しません)。通常、順序付けは 一意ではありません。
依存関係の順序付けはあらゆる場所にあります — コンパイラ、パッケージマネージャー、スプレッドシート再計算、CI パイプライン。
Topological sort は有向グラフのサイクル検出としても機能します。
問題を「制約条件下での順序付け」と認識し、トポロジカルソートに頼ることは、シニアレベルの強い信号です。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する