简化您的工作流程:搜索 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计算器厘米到英尺和英寸转换器毛利率计算器VAT计算器质数检查器定期存款计算器样本量计算器名人名言搜索 (英文)cpm计算器图片打码工具百分比折扣计算器音频提取器比例计算器斜边计算器百分比增长率计算器音频分割器血糖转换器卡方检验计算器📅 日期计算器MAC地址生成器kg到lbs转换器FPS 转换器罗马数字转换器🎮 游戏灵敏度转换器英寸到厘米转换器圆计算器合并视频SRT转为TXT工具MAC 地址分析工具t检验计算器删除空格英尺到米转换器厘米到英寸转换器随机字符串生成器平方根计算器调整视频速度HEX计算器百分比计算器月亮星座计算器百分比增加计算器股票平均成本计算器条形码生成器年龄计算器真心话大冒险生成器年度天数计算器 - 今天是今年的第几天闰年清单对数计算器复利计算机线性回归计算器数字提取器视频转图片提取器跑步配速计算器DOY日历互补误差函数计算器One Rep Max (1RM) 计算器两个日期之间体脂百分比计算器图片压缩器srt时间偏移利润计算器年金现值计算器随机分组生成器AI Token 计数器卧推计算器PSI 转 Bar 转换器随机扑克牌生成器Facebook用户ID查询分贝 (dB) 计算器图片分割器泰勒级数计算器🎰 抽卡保底计算器文本列提取器最简分数计算器鞋码转换器HEX转换器圆形面积计算器椭圆周长计算器相关系数计算器组合计算器每个月的天数分数百分比转换器填字游戏制作器质数列表不可见字符移除器unix时间转换器最小公倍数计算器kpa到psi转换器十进制到十六进制转换器为图片添加文字凯利公式计算器距离速度时间三角形计算器工作效率问题求解器混合问题求解器年龄问题求解器火车相遇问题求解器补水计算器配速卡路里计算器药物剂量计算器酒精卡路里计算器身体重塑计算器随机辩论话题生成器随机猫狗名字生成器随机圣经经文生成器随机数学题生成器随机段落生成器随机英文句子生成器砾石、砂和表土计算器钢材重量计算器螺栓扭矩计算器管道流量计算器梁荷载计算器美元换黄金转换器期权概率计算器股票拆分计算器员工持股计划计算器发票滞纳金计算器自由职业者时薪计算器租赁与购买对比计算器高级小费分摊计算器装箱清单生成器时差反应计算器旅行预算计算器飞行距离计算器热损失计算器发电成本计算器用水量计算器家电用电成本计算器家庭能源审计计算器太阳能投资回报率计算器太阳能板计算器堆肥CN比计算器草坪肥料计算器霜冻日期计算器高床种植箱土壤计算器NPK肥料计算器种子发芽率计算器视频比特率计算器音乐调性转换器音乐BPM节拍点击器照片文件大小估算计算器百万像素到打印尺寸计算器裁切系数计算器曝光三角计算器车辆牵引能力计算器汽车租赁计算器0–60与四分之一英里计算器电动车充电时间计算器电动汽车续航计算器汽车油耗计算器服装尺码转换器纸张尺寸参考表戒指尺寸转换器天文单位转换器燃油效率转换器数据传输速率转换器扭矩转换器 (Nm, ft-lb, kgf-cm)删除线文字生成器空白字符可视化工具阅读时间计算器演讲时间计算器段落计数器句子计数器音节计数器文本转二进制/十六进制/ASCII转换器Lorem Picsum / 占位符图片生成器.env 文件生成器Git 命令生成器颜色代码转换器全格式Bcrypt 哈希生成器和校验器JWT生成器CSS Grid 生成器数值积分计算器z变换计算器快速傅里叶变换FFT计算器张量积计算器矩阵指数计算器约当标准形计算器环与域计算器群论阶数计算器常微分方程组求解器伯努利微分方程求解器欧拉方法计算器方向场斜率场绘图器二阶常微分方程求解器一阶常微分方程求解器稳定婚姻问题求解器网络最大流计算器平面图检查器哈密顿路径检查器旅行商问题求解器 TSP线性规划求解器容斥原理计算器递推关系求解器邻接矩阵计算器拓扑排序计算器图着色计算器逻辑门模拟器卡诺图 (K-Map) 求解器布尔代数化简器分拆函数计算器数字根计算器斐波那契数检查器埃及分数计算器莫比乌斯函数计算器哥德巴赫猜想验证器梅森素数检查器孪生素数查找器亲和数检查器完全数检查器模幂运算计算器重复排列计算器效果量计算器相对风险计算器优势比计算器列联表计算器费舍尔精确检验计算器斯皮尔曼等级相关系数计算器贝塔分布计算器威布尔分布计算器指数分布计算器几何分布计算器负二项分布计算器超几何分布计算器F检验/F分布计算器贝叶斯定理计算器特征多项式计算器矩阵幂计算器乔列斯基分解计算器QR分解计算器矩阵对角化计算器克莱姆法则计算器列空间计算器零空间计算器向量夹角计算器单位向量计算器向量模计算器向量叉积计算器向量点积计算器矩阵乘法计算器逆矩阵计算器RREF计算器行最简阶梯形牛顿迭代法计算器雅可比矩阵计算器曲面积分计算器线积分计算器旋度计算器散度计算器梯度计算器多变量优化计算器微积分相关变化率求解器瞬时变化率计算器平均变化率计算器无限级数求和计算器级数收敛判定计算器幂级数计算器麦克劳林级数计算器洛必达法则计算器广义积分计算器辛普森法则计算器梯形法则计算器黎曼和计算器参数曲线绘图器旋转体表面积计算器旋转体体积计算器坐标几何距离计算器海伦公式计算器圆的切线计算器角平分线计算器内切圆计算器三角形外接圆计算器大圆距离计算器3D距离计算器环面计算器圆台计算器不规则多边形面积计算器正多边形计算器圆锥曲线识别器双曲线计算器抛物线计算器二项式定理展开计算器帕斯卡三角形生成器乘积符号计算器 (Pi记号)西格玛求和计算器有理根定理计算器笛卡尔符号法则计算器平行线和垂直线计算器直线方程计算器标准形式转斜截式转换器点斜式计算器非线性方程组求解器有理方程求解器字母方程求解器三角方程求解器指数方程求解器对数方程求解器四次方程求解器三次方程求解器估算计算器数字转分数转换器跳数生成器单位费率计算器上取整和下取整计算器绝对值计算器数列模式查找器位值图生成器运算顺序计算器PEMDAS竖式加减法计算器长乘法计算器乘法表生成器🎮 游戏货币换算器🎲 掉落概率计算器⚔️ DPS计算器❄️ 雪天计算器🚚 搬家费用估算器🔍 抄袭检测器📷 OCR / 图片文字识别📈 折线图制作工具🥧 饼图制作工具📊 柱状图制作工具🔊 音调发生器🖱️ 点击计数器在线记事本⬛ 宽高比计算器🌍 碳足迹计算器向 文胸尺码计算器轮胎尺寸计算器燃油费用计算器💧 露点计算器🌡️ 体感温度计算器🌬️ 风寒指数计算器⏰ 在线闹钟⏰ 考勤卡计算器📅 日期差计算器🕐 军事时间转换器⏱️ 小时计算器⏱️ 在线秒表⏱️ 倒计时器🌐 时区转换器地毯计算器挡土墙计算器HVAC容量计算器隔热材料计算器铺路石计算器钢筋计算器木材计算器平方英尺计算器交叉相乘计算器五数概括计算器百分位数计算器正态分布计算器p值计算器比率计算器配方法计算器四舍五入计算器长除法计算器Twitter/X 字符计数器YouTube评论抽选器YouTube标签提取器YouTube缩略图下载器youtube收益估算器随机RPG角色生成器