欢迎访问宙启技术站
智能推送

从零开始学习拓扑排序算法并在Python中实现

发布时间:2023-12-13 21:07:57

拓扑排序是一种在有向无环图(DAG)中对各顶点进行排序的算法,使得对于任意一条有向边$(u,v) ,u$在排序结果中都出现在$v$之前。拓扑排序可以用来确定工程的依赖关系,或者在编译器中确定源文件之间的编译顺序。

在学习拓扑排序算法之前,我们需要了解有向无环图(DAG)的定义。有向无环图是一种有向图,其中不存在从一个顶点出发经过若干个顶点回到自己的环路。

拓扑排序算法的基本思路是通过寻找入度为0的顶点来确定排序的顺序。具体步骤如下:

1. 首先创建一个队列,将所有入度为0的顶点放入队列。

2. 从队列中取出一个顶点进行处理,将其输出并在图中删除这个顶点以及从这个顶点出发的所有边。

3. 更新剩余顶点的入度,如果某个顶点入度为0,则将其放入队列。

4. 重复步骤2和步骤3,直到队列为空。

下面是在Python中实现拓扑排序算法的示例代码:

from collections import deque

def topoSort(graph):
    indegree = [0] * len(graph)  # 存储每个顶点的入度
    queue = deque()  # 创建一个队列用于存储入度为0的顶点

    # 计算每个顶点的入度
    for i in range(len(graph)):
        for j in range(len(graph[i])):
            indegree[graph[i][j]] += 1

    # 将入度为0的顶点放入队列
    for i in range(len(indegree)):
        if indegree[i] == 0:
            queue.append(i)

    # 开始拓扑排序
    while queue:
        vertex = queue.popleft()
        print(vertex)  # 输出顶点
        for i in range(len(graph[vertex])):
            indegree[graph[vertex][i]] -= 1  # 更新剩余顶点的入度
            if indegree[graph[vertex][i]] == 0:
                queue.append(graph[vertex][i])

# 测试拓扑排序算法
graph = [[],[2,3],[4],[5],[5],[]]
topoSort(graph)

在上述示例代码中,我们首先定义了一个有向无环图graph,其中每个元素表示顶点以及顶点指向的其他顶点。然后,我们通过计算每个顶点的入度,构建了一个入度数组indegree,并将入度为0的顶点放入队列。

随后,我们通过遍历队列,每次取出一个顶点,并输出它。然后,我们更新剩余顶点的入度,并将入度为0的顶点放入队列。重复以上步骤,直到队列为空,即完成了拓扑排序。

在这个例子中,输出结果是:0 1 2 3 4 5,表示按顺序排列的顶点。这个顺序是一个满足依赖关系的排序结果。

拓扑排序算法的时间复杂度为O(V + E),其中V为顶点数,E为边数。