简化您的工作流程:搜索 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计算器太阳、月亮与上升星座计算器 🌞🌙✨比例计算器wpa密钥生成器cpm计算器音频提取器SRT转为TXT工具HEX计算器样本量计算器百分比折扣计算器定期存款计算器VAT计算器随机选择器血糖转换器斜边计算器厘米到英尺和英寸转换器图片打码工具MAC地址生成器音频分割器分数计算器t检验计算器真心话大冒险生成器🌡️ 体感温度计算器MAC 地址分析工具调整视频速度FPS 转换器个人贷款计算器随机字符串生成器随机装备生成器One Rep Max (1RM) 计算器srt时间偏移对数计算器毛利率计算器二进制计算器合并视频随机扑克牌生成器随机名字选择器凯利公式计算器卡方检验计算器总和计算器随机IMEI生成器椭圆周长计算器百分比变化计算器kg到lbs转换器最简分数计算器英尺到米转换器🎮 游戏灵敏度转换器随机化数字随机数学题生成器随机电影选择器为图片添加文字标准偏差计算器 - 高精度百分比到ppm转换器MD5哈希生成器图片压缩器体脂百分比计算器SHA256 哈希生成器年龄计算器年度天数计算器 - 今天是今年的第几天位数计算器利润计算器平方根计算器磅转千克转换器Log Base 10 计算器不可见字符移除器圆形面积计算器文本转二进制/十六进制/ASCII转换器📅 日期计算器随机超能力生成器按字符数换行英寸到厘米转换器视频转图片提取器💧 露点计算器DOY日历指数计算器-高精度罗马数字转换器Facebook用户ID查询分贝 (dB) 计算器月亮星座计算器PSI 转 Bar 转换器泰勒级数计算器变异系数计算器AI标点符号添加器多项式展开计算器百分比计算器线性回归计算器图片分割器根式化简器科学记数法计算器闰年清单Voronoi 图生成器圆计算器随机分组生成器移除标点符号在线工具伊斯兰历转换器百分比增加计算器质数检查器余弦定理计算器数据传输速率转换器十进制到十六进制转换器厘米到英寸转换器工资转换计算器杀手数独生成器直方图生成器考拉兹猜想计算器逻辑门模拟器获取字符串长度相关系数计算器极坐标方程绘图器自酿啤酒酒精度计算器随机颜色生成器Bar to PSI 转换器IPv4/IPv6到十六进制转换器双曲函数计算器条形码生成器沸点计算器积分计算器视频压缩器原根计算器模计算器花样字体生成器GIF 转 MP4 转换器SRT合并工具半衰期计算器反向文字商和余数计算器弧长计算器atan2计算器十六进制到十进制转换器复数计算器角速度计算器词频分析器配速卡路里计算器kpa到psi转换器两个日期之间二项概率分布计算器农历转换器凯撒密码工具多项式根计算器与详细步骤百分比增长率计算器螺栓扭矩计算器视频分割器跑步配速计算器三角函数绘图器先付年金现值计算器参数曲线绘图器因子计算器快速傅里叶变换FFT计算器惯性矩计算器极限计算器每个月的天数矩形计算器英亩到平方米转换器随机数字选择器黄金分割计算器3D距离计算器RC时间常数计算器万花尺图案生成器年金现值计算器方差计算器 高精度随机名称生成器随机字母生成器目标心率计算器行数统计工具AI内容检测器F检验/F分布计算器YouTube缩略图下载器YouTube频道统计新月和满月日历555定时器计算器圆柱体体积计算器 高精度平均值计算器🎰 抽卡保底计算器按位计算器排序数字止损止盈计算器立方根计算器组合计算器股票盈亏计算器连续数之和计算器Argon2哈希生成器HEX转换器我的幸运数字是什么指数积分计算器排列计算器猫相当于人类的岁数磅到克转换器箱线图生成器骰子概率计算器JWT生成器乘法计算器体型计算器四分位数计算器字符计数器奖学金投资回报率计算器大学费用计算器语言学习流利度小时数计算器词汇测验生成器康奈尔笔记生成器学习曲线计算器抽认卡间隔重复调度器颜料调色计算器瓷砖填缝剂计算器洗碗机装载优化器洗涤剂用量计算器染发剂调配计算器打印成本计算器燃气与电力成本对比礼品卡小费计算器搬家纸箱数量计算器储物单元尺寸计算器胶囊衣橱搭配计算器皮带长度计算器液压缸推力计算器滑轮组计算器齿轮比计算器机械比热容计算器热膨胀计算器热传递计算器伯努利方程计算器雷诺数计算器太阳位置计算器潮汐时间计算器星空可见度计算器绳结打法参考工具睡袋温度评级指南帐篷地布尺寸计算器背包旅行食物重量计算器奈史密斯徒步配速计算器刺绣线长度计算器树脂浇注用量计算器串珠图案计算器陶土收缩率计算器折纸纸张尺寸计算器被子滚边计算器十字绣绣线计算器针织图案计算器编织针尺寸转换器钩针尺寸转换器马匹干草计算器宠物航空旅行航空箱尺寸查询器爬虫栖息地UVB计算器鸟笼尺寸计算器鱼缸加热棒瓦数计算器猫砂盆数量计算器前照灯光束距离计算器发动机压缩比计算器轮胎花纹磨损计算器挂车舌重计算器车辆重量分布计算器旅行费用分摊计算器刹车距离计算器工伤赔偿计算器遗嘱资产分配计算器商标分类查询工具专利申请费计算器销售税关联检查器刑期减免计算器诉讼时效计算器Airbnb 定价优化器室友房租分摊计算器Section 8 租金计算器BRRRR 方法计算器现金对现金回报率计算器租金收益率计算器1031 交换计算器财富增长可视化工具午餐花费计算器健身房 vs 家庭健身花费计算器咖啡花费计算器远程办公省钱计算器副业ROI计算器订阅费用追踪器SaaS定价计算器自由职业项目报价计算器烟熏木材搭配指南发酵时间计算器腌制时间计算器饮食限制食谱筛选器香料替代查找器咖啡因半衰期追踪器标准杯计算器葡萄酒搭配建议器攀岩难度等级转换器自行车齿轮比计算器钓鱼结强度计算器瑜伽体式保持计时器游泳SWOLF计算器跑步成绩预测计算器拳击出拳力量计算器橄榄球得分计算器板球得分率计算器足球 xG预期进球计算器网球计分器Wells评分计算器 (DVT/PE)格拉斯哥昏迷评分计算器阿普加评分计算器FFMI计算器库珀12分钟跑步计算器一英里步行测试Rockport计算器瘦体重力量计算器碳水化合物胰岛素比例计算器胰岛素敏感系数计算器希伯来历转换器跨文化年龄计算器多久以前计算器还有多久倒计时计算器日期模式生成器中间日期计算器日期添加工作日工作日计算器句子长度方差分析器海明威风格可读性编辑器发音音标转换器维吉尼亚密码工具埃特巴什密码工具ROT13编码解码器EXIF数据查看与移除工具猪拉丁文翻译器倒推首字母缩写生成器首字母缩写生成器全字母句检查器漏字文检测器图像转SVG描摹器图片转 ASCII 艺术转换器JSON Schema 生成器TypeScript 在线演练场Less 到 CSS 编译器SCSS转CSS编译器SVG 转 React/JSX 转换器查询字符串生成器URL解析器UUID验证和解码器HTTP状态码参考cURL命令构建器谢尔宾斯基三角形生成器3D曲面绘图器朱利亚集合生成器曼德博集合探索器L-System分形生成器Delaunay 三角剖分生成器镶嵌图案生成器六西格玛过程能力计算器帕累托图生成器NPS净推荐值计算器留存率同期群计算器客户流失率计算器客户获取成本CAC计算器客户终身价值 CLV 计算器转化率计算器A/B测试样本量计算器A/B测试显著性计算器透镜方程计算器导线磁场计算器电场计算器库仑定律计算器斯涅尔定律计算器向心力计算器单摆周期计算器弹簧劲度系数计算器多普勒效应计算器索提诺比率计算器特雷诺比率计算器股票贝塔系数计算器通胀保值美国国债 (TIPS) 计算器房贷重新摊还计算器远期利率计算器债券久期计算器 (麦考利和修正)债券凸性计算器固定指数年金计算器变额年金计算器反向抵押贷款计算器年金支付计算器日本算盘模拟器俄罗斯农民乘法吠陀数学技巧计算器古埃及乘法计算器罗马数字数学求解器心算训练器乘法口诀表测验进位与借位可视化工具数的分合生成器硬币应用题求解器距离速度时间三角形计算器工作效率问题求解器混合问题求解器年龄问题求解器火车相遇问题求解器补水计算器药物剂量计算器酒精卡路里计算器身体重塑计算器随机辩论话题生成器随机猫狗名字生成器youtube收益估算器随机RPG角色生成器