拓扑排序(TopSort)是一种针对有向无环图(DAG)的线性排序算法。
假如我有以下的一个DAG:
其中A→B 表示 在完成B之前必须完成A(这个很重要是拓扑排序的原则)。
我们将有一个→ 指向,称为有一个入度。
上图中初始时入度如下:
A:0 B:1 C:1 D:2
下面的代码实现思路如下:
- 找到入度为零的节点,将其装入队列(先进先出),比如 A。
- 从队列中取出A,通过A的指向,找到 B,并将B的入度减一,判断B的入度是否为0,如若为0,将B装进队列。(这里是为零)。同理,通过A找到C。
- 这样的不断的装取队列。
- 记录下每次取出队列的节点,就可以得到一个拓扑排序了。
下面是python实现的kahn算法示例:
from collections import deque
def topsort_kahn(graph):
in_degree = {u: 0 for u in graph}
for u in graph:
for v in graph[u]:
in_degree[v] += 1queue = deque([u for u in in_degree if in_degree[u] == 0])
result = []while queue:
u = queue.popleft()
result.append(u)
for v in graph[u]:
in_degree[v] -= 1
if in_degree[v] == 0:
queue.append(v)if len(result) != len(graph):
print("有环,无法拓扑排序")
return [] # 存在环,无法拓扑排序
return result
graph = {
'A': ['B','C'],
'B': ['D'],
'C': ['D'],
'D': []
}
result= topsort_kahn(graph)
for letter in result:
print(letter)