简化您的工作流程:搜索 miniwebtool。
添加插件
> 拓扑排序计算器
 

拓扑排序计算器

使用 Kahn 算法或 DFS 计算有向无环图 (DAG) 的拓扑排序。支持检测循环并报告路径、构建并行执行层级视图、支持字典序最小排序,并提供交互式图表的步骤动画演示。

拓扑排序计算器
边格式:A -> B (也接受 , =>, :)。最多 80 个顶点 / 800 条边。
Kahn 算法(字典序)给出唯一的、可重现的顺序。DFS 后序遍历是经典的深度优先方法。

Embed 拓扑排序计算器 Widget

拓扑排序计算器

拓扑排序计算器用于计算有向无环图 (DAG) 顶点的线性排序,使得对于从 u 到 v 的每一条有向边,u 都在 v 之前。以边列表或邻接表的形式输入图数据,该工具将使用 Kahn 算法或 DFS 后序遍历返回拓扑排序结果,检测环(并给出精确的环路径),将任务划分为并行执行层,计算有效排序的总数,并在交互式图表上以动画形式演示每一步。

什么是拓扑排序?

给定一个有向图 G = (V, E),拓扑排序(或拓扑序列)是其顶点的一种线性排列 v₁, v₂, …, vₙ,使得对于每一条有向边 (u → v),u 在排列中都出现在 v 之前。当且仅当图中没有有向环时(即该图为 DAG),才存在拓扑排序。这种排序通常不是唯一的:当多个顶点的入度同时为零时,图可以有多种有效的拓扑排序。

拓扑排序定义
V 的一个排列 (v₁, v₂, …, vn) 是拓扑排序,当且仅当
对于 E 中的每一条边 (u → v):position(u) < position(v)

此计算器使用的算法

Kahn 算法 (基于 BFS,1962年)

Kahn 算法是最直观的拓扑排序算法。在每一步中,它选择一个入度为零(没有指向它的边)的顶点,将其添加到输出结果中,并从图中“移除”它(即减少其每个后继节点的入度)。当有多个顶点的入度为零时,可以使用最小堆(得到字典序最小的排序)或 FIFO 队列(得到插入顺序的排序)来打破僵局。Kahn 算法的运行时间为 O(|V| + |E|),同时也可用作环检测器:如果队列为空后仍有顶点的入度 > 0,则说明图中存在环。

Kahn 算法 (伪代码)
Kahn(G):
  Q ← { v ∈ V : indeg(v) = 0 }
  L ← [ ]
  while Q 不为空:
    u ← Q.pop()
    L.append(u)
    for 每一条边 u → v:
      indeg(v) -= 1
      if indeg(v) = 0: Q.push(v)
  if |L| < |V|: 报告存在环
  else: 返回 L

DFS 后序遍历 (Tarjan,1976年)

DFS 算法运行深度优先搜索,每当一个顶点完成搜索(即其所有后继节点都已被完全探索)时,将其压入栈中。最后反转栈中的元素即可得到有效的拓扑排序。环检测非常自然:如果遇到一个仍处于进行中状态(标记为灰色)的顶点,说明发现了一条回边,因此该图不是 DAG。DFS 后序遍历的运行时间同样为 O(|V| + |E|)。

DFS 后序遍历 (伪代码)
DFS-Topo(G):
  for V 中的每个顶点 u: color[u] ← 白色
  L ← 空栈
  for V 中的每个顶点 u:
    if color[u] = 白色: visit(u)
  return reverse(L)

visit(u):
  color[u] ← 灰色
  for 每一条边 u → v:
    if color[v] = 灰色: 报告存在环
    if color[v] = 白色: visit(v)
  color[u] ← 黑色; L.push(u)

并行执行层

DAG 的分层视图将其顶点划分为不同的级别,使得每条边都从较低编号的级别指向较高编号的级别。同一层中的顶点相互独立,因此可以并行执行。层数等于最长路径的长度加一,这被称为 DAG 的关键路径,即即使拥有无限的并行能力,完成所有任务所需的最少顺序轮次。只要输入的是 DAG,此计算器就会自动生成分层视图。

环检测

如果图中包含有向环,则无法进行拓扑排序。我们的计算器会报告具体的环路径(例如 A → B → C → A),并在可视化界面上用红色标出环边。移除环上的任意一条边即可恢复无环状态。

输入格式

边列表

将每条有向边写为 起点 -> 终点,用逗号或换行符分隔。接受的箭头变体:->, , =>, -->, :。你还可以使用链式表达:A -> B -> CA->BB->C 的简写。顶点标签可以是字母、数字、下划线、短横线和点。

A -> B, B -> C, A -> C
C -> D
衬衫 -> 领带 -> 夹克

邻接表

写下每个顶点、一个冒号及其直接后继节点(它指向的顶点)。没有后继节点的顶点仍需占一行,例如 D:

A: B, C
B: D
C: D
D:

如何使用此计算器

  1. 选择格式: 使用单选按钮在边列表和邻接表之间切换。
  2. 输入图数据: 粘贴数据或点击快速示例(穿衣顺序、课程先修、构建目标、含环图等)。
  3. 选择算法: 选择 Kahn 字典序以获得唯一的、可重现的顺序;选择插入顺序以保留输入顺序;选择 DFS 后序遍历以使用经典深度优先方法;或选择“显示全部”并排查看每种排序。
  4. 点击“拓扑排序”: 排序结果、环检测、分层视图、关键路径长度、有效排序总数和交互式图表将显示在下方。
  5. 探索: 点击“播放”观看每个顶点逐步输出。入度徽章会实时更新。拖动任何节点可重新安排布局。

实际应用

构建系统和编译器

make、Bazel、Gradle 和 npm 这样的工具会对它们的构建目标进行拓扑排序,以便每个目标仅在其所有依赖项编译完成后才进行编译。依赖图中的环通常被报告为致命错误——构建系统无法确定从何处开始。

任务调度

项目经理使用 DAG 来记录任务依赖关系。拓扑排序给出了有效的执行顺序,而分层视图给出了无限并行情况下的最少轮次。最长链是决定项目持续时间的关键路径

课程先修计划

大学课程目录是一个 DAG:边表示先修关系。拓扑排序是一个合法的学习计划,而层级则告诉学生每个学期可以并行修读哪些课程。

电子表格重算

当单元格发生变化时,电子表格必须按依赖顺序重新计算每个下游单元格——这是对单元格依赖 DAG 的拓扑排序。循环引用(环)会被应用程序拒绝。

包管理器和插件加载器

Apt、pip、Homebrew、Maven 和无数的插件框架通过对它们的依赖 DAG 进行拓扑排序来解决安装或加载顺序问题。

符号解析和指令调度

编译器使用拓扑排序来对声明进行排序,而 CPU 使用数据依赖 DAG 在重排序缓冲区中调度指令,以避免违反数据冒险。

计算拓扑排序的数量

对于一个包含 n 个顶点的 DAG,不同有效拓扑排序的数量范围从 1(完全排序的链)到 n!(无边的图)。计算精确数量通常是 #P-完全 问题,但对于最多 16 个顶点的图,此计算器使用位掩码动态规划公式进行计算:f(S) = Σ f(S ∪ {v}),其中 v ∉ S 且其所有前驱节点都在 S 中。

复杂度与性能

常见问题

什么是拓扑排序?

有向无环图的拓扑排序是其顶点的一种线性排序,使得对于从 u 到 v 的每一条有向边,u 都排在 v 之前。它代表了在尊重任务依赖关系的前提下处理任务的合法顺序。

此计算器使用哪种算法?

计算器同时运行 Kahn 算法和 DFS 后序遍历。Kahn 算法通过不断移除入度为零的顶点并减少其后继节点的入度来工作。DFS 后序遍历运行深度优先搜索并反转完成顺序。两者的运行时间均为 O(|V| + |E|)。

如果我的图中有环怎么办?

含有有向环的图没有拓扑排序。计算器会检测到环,在可视化中用红色标出,并报告精确的环路径,以便你了解需要移除哪些边才能使图成为 DAG。

什么是字典序最小的拓扑排序?

当存在多种有效的拓扑排序时,通过在每一步始终选择入度为零且按字母顺序最小的顶点,可以获得字典序最小的排序。此计算器默认的 Kahn 模式会返回这种唯一的排序,它稳定且易于重现。

什么是层级或水平视图?

层级视图根据距任何源节点的最长路径长度对顶点进行分组。同一层中的顶点之间没有依赖关系,因此可以并行运行。层数等于最长依赖链加一,代表了完成所有任务所需的最少并行轮次。

一个图可以有多个有效的拓扑排序吗?

是的。如果在 Kahn 算法的任何步骤中有多个入度为零的顶点,则下一步可以选择其中的任何一个。此计算器可以计算包含最多 16 个顶点的图的不同拓扑排序的精确数量。

Kahn 算法和 DFS 后序遍历有什么区别?

Kahn 算法是自顶向下的:它反复选择源节点(入度为 0)并首先输出它们。DFS 后序遍历是自底向上的:它先完成汇节点并将它们置于排序末尾。两者都是 O(|V| + |E|) 并能产生有效的拓扑排序,但通常结果不同。Kahn 算法更易于并行化和适配字典序;DFS 更易于与其他基于 DFS 的分析(如强连通分量)结合。

该工具支持的最大图规模是多少?

该计算器支持最多 80 个顶点和 800 条边。计算有效拓扑排序的总数上限为 16 个顶点,因为该问题是 #P-完全的,且状态空间随 2ⁿ 增长。交互式可视化和算法动画可以在最大支持规模内平滑运行。

延伸阅读

引用此内容、页面或工具为:

"拓扑排序计算器" 于 https://MiniWebtool.com/zh-cn//,来自 MiniWebtool,https://MiniWebtool.com/

由 miniwebtool 团队开发。更新日期:2026年4月20日

您还可以尝试我们的 AI数学解题器 GPT,通过自然语言问答解决您的数学问题。

常用工具:

随机信用卡生成器MAC地址查找相对标准偏差计算器彩票号码生成器网址提取器CAGR计算器太阳、月亮与上升星座计算器 🌞🌙✨百分比折扣计算器t检验计算器毛利率计算器样本量计算器英尺英寸转换为厘米VAT计算器合并视频cpm计算器随机选择器HEX计算器相关系数计算器Markdown编辑器磅转千克转换器SHA256 哈希生成器定期存款计算器斜边计算器图片打码工具标准偏差计算器 - 高精度🎮 游戏灵敏度转换器音频提取器比例计算器分数计算器石头剪刀布生成器条形码生成器罗马数字转换器血糖转换器SRT转为TXT工具kg到lbs转换器减重计算器文本列提取器MAC地址生成器英寸到厘米转换器📅 日期计算器厘米到英尺和英寸转换器MAC 地址分析工具异常值计算器月亮星座计算器百分比变化计算器音频分割器AI Token 计数器百分比增加计算器视频转图片提取器线性回归计算器FPS 转换器椭圆周长计算器对数计算器随机分组生成器年龄计算器百分比增长率计算器变异系数计算器获取字符串长度调整视频速度厘米到英寸转换器枢轴点计算器DOY日历随机字符串生成器宏量营养素计算器 - 确定您的每日营养素需求英尺到米转换器复利计算机Log Base 10 计算器Facebook用户ID查询为图片添加文字最简分数计算器圆计算器图片压缩器比例置信区间计算器两点间距离计算器指数计算器-高精度AI内容检测器填字游戏制作器🎰 抽卡保底计算器利润计算器因子计算器随机IMEI生成器随机扑克牌生成器One Rep Max (1RM) 计算器卡方检验计算器股票平均成本计算器闰年清单卧推计算器复数计算器年金现值计算器srt时间偏移数字提取器谐振频率计算器阻抗计算器unix时间转换器复合增长率计算器百分比计算器工资转换计算器组合计算器跑步配速计算器随机字母生成器邻接矩阵计算器拓扑排序计算器图着色计算器逻辑门模拟器卡诺图 (K-Map) 求解器布尔代数化简器分拆函数计算器数字根计算器斐波那契数检查器埃及分数计算器莫比乌斯函数计算器哥德巴赫猜想验证器梅森素数检查器孪生素数查找器亲和数检查器完全数检查器模幂运算计算器重复排列计算器效果量计算器相对风险计算器优势比计算器列联表计算器费舍尔精确检验计算器斯皮尔曼等级相关系数计算器贝塔分布计算器威布尔分布计算器指数分布计算器几何分布计算器负二项分布计算器超几何分布计算器F检验/F分布计算器贝叶斯定理计算器特征多项式计算器矩阵幂计算器乔列斯基分解计算器QR分解计算器矩阵对角化计算器克莱姆法则计算器列空间计算器零空间计算器向量夹角计算器单位向量计算器向量模计算器向量叉积计算器向量点积计算器矩阵乘法计算器逆矩阵计算器RREF计算器行最简阶梯形牛顿迭代法计算器雅可比矩阵计算器曲面积分计算器线积分计算器旋度计算器散度计算器梯度计算器多变量优化计算器微积分相关变化率求解器瞬时变化率计算器平均变化率计算器无限级数求和计算器级数收敛判定计算器幂级数计算器麦克劳林级数计算器洛必达法则计算器广义积分计算器辛普森法则计算器梯形法则计算器黎曼和计算器参数曲线绘图器旋转体表面积计算器旋转体体积计算器坐标几何距离计算器海伦公式计算器圆的切线计算器角平分线计算器内切圆计算器三角形外接圆计算器大圆距离计算器3D距离计算器环面计算器圆台计算器不规则多边形面积计算器正多边形计算器圆锥曲线识别器双曲线计算器抛物线计算器二项式定理展开计算器帕斯卡三角形生成器乘积符号计算器 (Pi记号)西格玛求和计算器有理根定理计算器笛卡尔符号法则计算器平行线和垂直线计算器直线方程计算器标准形式转斜截式转换器点斜式计算器非线性方程组求解器有理方程求解器字母方程求解器三角方程求解器指数方程求解器对数方程求解器四次方程求解器三次方程求解器估算计算器数字转分数转换器跳数生成器单位费率计算器上取整和下取整计算器绝对值计算器数列模式查找器位值图生成器运算顺序计算器PEMDAS竖式加减法计算器长乘法计算器乘法表生成器🎮 游戏货币换算器🎲 掉落概率计算器⚔️ DPS计算器❄️ 雪天计算器🚚 搬家费用估算器🔍 抄袭检测器📷 OCR / 图片文字识别📈 折线图制作工具🥧 饼图制作工具📊 柱状图制作工具🔊 音调发生器🖱️ 点击计数器在线记事本⬛ 宽高比计算器🌍 碳足迹计算器向 文胸尺码计算器轮胎尺寸计算器燃油费用计算器💧 露点计算器🌡️ 体感温度计算器🌬️ 风寒指数计算器⏰ 在线闹钟⏰ 考勤卡计算器📅 日期差计算器🕐 军事时间转换器⏱️ 小时计算器⏱️ 在线秒表⏱️ 倒计时器🌐 时区转换器地毯计算器挡土墙计算器HVAC容量计算器隔热材料计算器铺路石计算器钢筋计算器木材计算器平方英尺计算器交叉相乘计算器五数概括计算器百分位数计算器正态分布计算器p值计算器比率计算器配方法计算器四舍五入计算器长除法计算器科学计算器番茄钟学习计时器有效数字计算器考试成绩计算器加权成绩计算器期末成绩计算器成绩计算器分贝 (dB) 计算器功率因数计算器RC时间常数计算器变压器计算器线规计算器555定时器计算器电容器计算器并联电阻计算器分压器计算器LED电阻计算器摩尔/克/粒子转换器滴定计算器沸点计算器经验式计算器百分产率计算器化学计量计算器化学方程式配平器稀释计算器马力计算器扭矩计算器自由落体计算器理想气体状态方程计算器压力计算器密度计算器功和功率计算器势能计算器动能计算器抛体运动计算器动量计算器速度计算器加速度计算器力计算器网红营销ROI计算器ROAS计算器CTR计算器社交媒体用户名检查器社交媒体发帖时间优化器社交媒体ROI计算器Facebook广告费用计算器YouTube Shorts收益计算器Twitch收益计算器YouTube观看时间计算器Twitter/X 时间戳转换器YouTube频道统计TikTok收益计算器社交媒体图片尺寸指南Instagram字体生成器Twitter/X 字符计数器YouTube评论抽选器YouTube标签提取器YouTube缩略图下载器youtube收益估算器随机RPG角色生成器