有向无环图之拓扑排序kahn算法(基于入度)

拓扑排序(TopSort)是一种针对有向无环图(DAG)的线性排序算法。

假如我有以下的一个DAG:

其中A→B 表示 在完成B之前必须完成A(这个很重要是拓扑排序的原则)。

我们将有一个→ 指向,称为有一个入度。

上图中初始时入度如下:

A:0  B:1  C:1  D:2

下面的代码实现思路如下:

  1. 找到入度为零的节点,将其装入队列(先进先出),比如 A。
  2. 从队列中取出A,通过A的指向,找到 B,并将B的入度减一,判断B的入度是否为0,如若为0,将B装进队列。(这里是为零)。同理,通过A找到C。
  3. 这样的不断的装取队列。
  4. 记录下每次取出队列的节点,就可以得到一个拓扑排序了。

下面是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] += 1

    queue = 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值