拓扑排序(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)
相关推荐
l1258656 分钟前
# LangGraph Tool Calling Agent 深度实战:从零构建 ReAct 循环与工具调用链
人工智能·python·自然语言处理·langchain·agent
AI人工智能+电脑小能手12 分钟前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
reasonsummer14 分钟前
【办公类-119-03】20260901三个园区“国旗下讲话” 按班级组合docx模板(AI+excel+python、deepseek和豆包、微信自动私发)
python
慢云智慧空间20 分钟前
从设备联网到空间理解,智能建筑的系统架构正在经历哪些关键变化?
python·系统架构
磁场转动100万匹2 小时前
PyTorch 手写数字识别实战:从数据加载到模型训练(零基础详解版)
人工智能·pytorch·python
青 春 记 忆8 小时前
零基础入门python30:Flask个人账本从空目录运行与阶段验收
python·flask·后端开发
l1258659 小时前
# LangGraph Memory机制深度解析:短期记忆与长期记忆的工程实践
前端·人工智能·python·langchain·bootstrap
金銀銅鐵10 小时前
斐波那契数列的个位数出现的周期是多少?
python·数学
whcyhhh11 小时前
头歌实践教学平台:数据科学与大数据技术导论(十二)
大数据·开发语言·python·数据清洗
qq_3164110312 小时前
专业的腹腔镜医疗器械物联网APP开发服务商
python