拓扑排序(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)
相关推荐
Y幽谷客1 小时前
Python加载本地大模型(Qwen3.5 8B)
python·大模型
伞伞悦读1 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
线上放牧人2 小时前
Windows删除图标缓存
windows·python·pyqt
qq_5470261792 小时前
Python 变量和简单数据类型
python
xiaofeiyang1502 小时前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
智搜广告3 小时前
智搜广告:科技行业AI回答优化公司如何破局
大数据·python·elasticsearch·geo
IpdataCloud4 小时前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)
数据库·python·tcp/ip
2601_966949654 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
蒸鱼Yuzheng4 小时前
Python 游戏测试开发怎么准备:日志解析、接口校验、并发与可维护性
自动化测试·python·测试开发·面试题·游戏测试
Ivanqhz5 小时前
BM1688 双核架构
python·深度学习·神经网络·cnn·mlir