序文
トポロジカル ソートは、有向非巡回グラフ (DAG) をソートするためのグラフ理論における重要なソート アルゴリズムです。トポロジカルソートでは、グラフの頂点がタスクを表し、有向辺がタスク間の依存関係を表します。トポロジカルソートアルゴリズムは、すべてのタスクの依存関係を満たす順序を見つけます。
アルゴリズム原理
トポロジカルソートアルゴリズムの基本原理は次のとおりです。
- 空の並べ替え結果リストを作成します。
- グラフ内の次数 0 を持つすべての頂点 (つまり、依存関係のない頂点) を検索し、並べ替えられた結果リストに追加します。
- 頂点とそれに関連するエッジを削除します。
- グラフ内のすべての頂点が処理されるまで、手順 2 と 3 を繰り返します。
- ソート結果リストの長さがグラフ内の頂点の数と等しい場合、トポロジカル ソートは成功します。そうでない場合、グラフ内に循環が存在するため、トポロジカル ソートは実行できません。
Pythonの実装
以下は、Python でトポロジカル ソート アルゴリズムを実装するサンプル コードです。
from collections import deque
def topological_sort(graph):
# 统计每个顶点的入度
in_degree = {
v: 0 for v in graph}
# 计算每个顶点的入度
for v in graph:
for neighbor in graph[v]:
in_degree[neighbor] += 1
# 将入度为0的顶点加入队列
queue = deque([v for v in graph if in_degree[v] == 0])
# 保存拓扑排序的结果
result = []
while queue:
# 取出队列中的顶点
v = queue.popleft()
result.append(v)
# 移除顶点及其相关边
for neighbor in graph[v]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
# 判断是否存在环
if len(result) != len(graph):
raise ValueError("图中存在环,无法进行拓扑排序。")
return result
# 测试
graph = {
'A': ['B', 'C'],
'B': ['D'],
'C': ['D', 'E'],
'D': ['F'],
'E': ['F'],
'F': []
}
try:
result = topological_sort(graph)
print("拓扑排序结果:", result)
except ValueError as e:
print(e)
上記のコードでは、graph
グラフの隣接リスト表現を表します。各頂点はキーとして表され、その対応する値は頂点に直接接続されている頂点を格納するリストです。
コードを実行すると、トポロジカルソートの結果が出力されます。
Python を使用してトポロジカル ソート アルゴリズムを実装するサンプル コードは以上です。このアルゴリズムを使用すると、有向非巡回グラフを実行できます。
ソートして、タスクの依存関係を満たす順序を見つけます。