在图论中,拓扑排序(Topological Sorting)是将有向无环图(DAG, Directed Acyclic Graph)中的顶点排成一个线性序列的过程。如果存在一条从顶点A到顶点B的路径,则在排序后的线性序列中,顶点A必定会出现在顶点B之前。拓扑排序对于理解图的结构和解决一些依赖关系问题非常有用。
一个有向图被称为有向无环图(Directed Acyclic Graph, DAG),当且仅当该图中不存在环。即从任何顶点出发,沿着某条路径不能回到自身。在这样的图上可以定义拓扑排序。
Kahn算法是一种常用的拓扑排序方法,其具体步骤如下:
对于含有 V 个顶点和 E 条边的图,Kahn 算法的时间复杂度为 O(V + E),因为每个顶点和每条边都会被访问一次。
from collections import deque, defaultdict
def topological_sort(graph):
# 计算入度
in_degree = {u: 0 for u in graph}
for u in graph:
for v in graph[u]:
in_degree[v] += 1
# 初始化队列,包含所有入度为0的顶点
queue = deque([u for u in graph if in_degree[u] == 0])
sorted_order = []
while queue:
vertex = queue.popleft()
sorted_order.append(vertex)
for v in graph[vertex]:
in_degree[v] -= 1
if in_degree[v] == 0:
queue.append(v)
return sorted_order
# 示例图
graph = {
'A': ['B', 'C'],
'B': ['D'],
'C': ['D', 'E'],
'D': [],
'E': ['F'],
'F': []
}
print(topological_sort(graph)) # 输出可能为:['A', 'C', 'B', 'E', 'F', 'D']
拓扑排序是一种强大的工具,能够帮助我们理解图中的依赖关系。通过Kahn算法等方法,可以有效地计算出有向无环图的拓扑顺序。这一过程不仅有助于解决实际问题中的任务调度和项目管理等问题,也是图数据处理与分析的重要基础之一。