拓扑排序(Topological Sort)

拓扑排序(Topological Sort)

定义

拓扑排序是对有向无环图(DAG, Directed Acyclic Graph) 中所有节点进行线性排序的算法,使得对于图中每条有向边 u → v,节点 u 在排序结果中都出现在节点 v 之前。

⚠️ 拓扑排序只适用于有向无环图,如果图中存在环,则无法进行拓扑排序。


直观理解

想象一组任务,某些任务必须在其他任务之前完成:

复制代码
穿袜子 → 穿鞋子
穿内衣 → 穿衬衫 → 穿外套
穿裤子 → 穿鞋子

拓扑排序就是找到一个合法的执行顺序,例如:
穿内衣 → 穿袜子 → 穿裤子 → 穿衬衫 → 穿外套 → 穿鞋子


两种经典算法

1. Kahn 算法(BFS 方式)

核心思想:不断移除入度为 0 的节点

python 复制代码
from collections import deque

def topological_sort_kahn(graph, in_degree):
    queue = deque()
    result = []

    # 将所有入度为 0 的节点加入队列
    for node in in_degree:
        if in_degree[node] == 0:
            queue.append(node)

    while queue:
        node = queue.popleft()
        result.append(node)

        for neighbor in graph[node]:
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.append(neighbor)

    # 如果结果长度不等于节点数,说明有环
    if len(result) != len(in_degree):
        return []  # 存在环
    return result

步骤:

  1. 计算所有节点的入度
  2. 将入度为 0 的节点入队
  3. 出队一个节点,将其邻居的入度 -1
  4. 若邻居入度变为 0,则入队
  5. 重复直到队列为空

2. DFS 算法(深度优先搜索)

核心思想:DFS 后序遍历,逆序即为拓扑序

python 复制代码
def topological_sort_dfs(graph):
    visited = set()
    stack = []

    def dfs(node):
        visited.add(node)
        for neighbor in graph.get(node, []):
            if neighbor not in visited:
                dfs(neighbor)
        stack.append(node)  # 后序加入

    for node in graph:
        if node not in visited:
            dfs(node)

    return stack[::-1]  # 逆序输出

两种算法对比

特性 Kahn(BFS) DFS
实现方式 迭代 递归
环检测 ✅ 天然支持 需额外标记
时间复杂度 O(V + E) O(V + E)
空间复杂度 O(V) O(V)
结果唯一性 不唯一 不唯一

应用场景

场景 说明
📦 包管理器 npm、pip 解析依赖安装顺序
🏗️ 构建系统 Make、Gradle 确定编译顺序
📚 课程规划 先修课程问题
🔄 任务调度 确定任务执行顺序
🗃️ 数据库 外键约束的表创建顺序

总结

复制代码
拓扑排序 = 对 DAG 节点排序,保证所有边从前指向后
核心性质:有向 + 无环 → 才能拓扑排序
两种算法:Kahn(BFS入度法)/ DFS(后序逆置法)
时间复杂度:O(V + E)
相关推荐
一个处女座的程序猿O(∩_∩)O22 分钟前
Python基础知识大全:从零开始掌握Python核心语法
开发语言·python
小陈工25 分钟前
Python Web开发入门(十一):RESTful API设计原则与最佳实践——让你的API既优雅又好用
开发语言·前端·人工智能·后端·python·安全·restful
deephub1 小时前
ADK 多智能体编排:SequentialAgent、ParallelAgent 与 LoopAgent 解析
人工智能·python·大语言模型·agent
FL16238631291 小时前
基于yolov26+pyqt5的混凝土墙面缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
python·qt·yolo
cxr8282 小时前
GPU 加速声场求解器 CUDA Kernel 实现细节 —— 高频超声传播仿真并行计算引擎
人工智能·python·目标跟踪
枫叶林FYL2 小时前
第10章 符号推理与神经符号AI
pytorch·python·深度学习
nimadan123 小时前
剧本杀app2025推荐,多类型剧本体验与社交互动优势
人工智能·python
HAPPY酷3 小时前
Python高阶开发:从底层原理到架构设计的进阶之路
开发语言·python
疯狂打码的少年3 小时前
【Day 6 Java转Python】字符串处理的“降维打击”
java·开发语言·python
2301_764441333 小时前
家国同构模型:计算社会学的创新探索
python·数学建模