Java 中的 Kahn 拓扑排序算法17 Mar 2025 | 6 分钟阅读 Kahn 算法是一种用于对有向无环图(DAG)进行拓扑排序的流行方法。拓扑排序是对 DAG 中的顶点进行排序,使得对于每条有向边(u,v),顶点 u 在排序中出现在顶点 v 之前。换句话说,排序后的图中没有环。 一个图可能存在多个拓扑排序。例如,下面的图可以有两种有效的拓扑排序:“5 4 2 3 1 0”和“4 5 2 0 3 1”。在任何有效的拓扑排序中,第一个顶点始终是入度为 0 的顶点,表示它没有来自图中其他顶点的传入边。 ![]() 示例 输入 ![]() 输出 5 4 2 3 1 0 解释:有向无环图(DAG)的拓扑排序是其顶点的线性排序。对于每条有向边 uv,顶点 u 在排序中出现在 v 之前。这意味着对于任何顶点 v,其所有依赖项(指向 v 的边所连接的顶点)必须在排序中出现在 v 之前。 在给定的示例中,顶点 5 和 4 没有传入边,因此它们可以在拓扑排序中以任意顺序排列。顶点 2 和 0 分别有来自 4 和 5 的传入边,因此它们在拓扑排序中必须出现在 4 和 5 之后。最后,顶点 1 没有依赖项,因此它必须排在最后。 示例 输入 ![]() 输出 0 3 4 1 2 解释:在有向无环图(DAG)中,0 和 3 没有传入边,4 和 1 有来自 0 和 3 的传入边,而 2 放在最后。 直观理解 拓扑排序的直观理解是,我们可以从没有依赖项的顶点开始,然后添加依赖于它们的顶点。这可以确保我们永远不会在依赖项之前添加顶点,否则会导致图中出现环。
拓扑排序算法类似于广度优先搜索(BFS),但仅当顶点入度为 0 时才将其添加到队列中。这确保了顶点按照依赖关系顺序添加到拓扑排序中。 算法
如何找到每个节点的入度? 顶点的入度是指指向该顶点的边的数量。在您提供的代码中,每个顶点的入度是在以下 for 循环中计算的。 for 循环遍历图中的所有邻接列表。对于每个邻接列表,它会遍历邻接列表中所有边的目标节点。对于每个目标节点,它会增加目标顶点的入度。它确保在遍历完所有邻接列表后,每个顶点的入度都是正确的。 实施文件名:TopologicalSort.java 输出 Topological Sorting: 4 5 2 0 3 1 时间复杂度:代码的时间复杂度为 O(V + E),其中 V 是顶点的数量,E 是图中的边的数量。 辅助空间:辅助空间复杂度为 O(V),这来自于算法中使用的额外数据结构。 Kahn 算法拓扑排序的应用
下一个主题最受欢迎的 Java 后端工具 |
Java.lang.String 或 String 类,是 API 中的一个重要类。String 类在 Java API 中具有许多许多程序员并未立即意识到的独特功能。理解 String 类是学习 Java 的先决条件。它...
阅读 4 分钟
Java 中有 23 种设计模式,它们为应用程序设计中常见的问题提供了明确的解决方案。它代表了应用程序及其流程的详细描述。它是许多……中可用的问题解决方案。
阅读9分钟
超级巨星困境是计算机科学中,特别是在算法问题解决领域中经常遇到的经典难题。这个问题可以概括如下。假设有一个有 N 个人的聚会。“名人”意味着每个人都知道某个人,但没有人知道其他人。目标是...
5 分钟阅读
在本节中,我们将通过不同的方法学习如何使用 Java 查看二叉树的底部视图。在二叉树的底部视图中,我们只打印那些当二叉树...时可见的节点。
5 分钟阅读
在 Java 中,当组织包含重复元素的集合以及借助 Multiset 统计元素频率时。Java SE 在其标准库中不支持 Multiset 作为接口,但它可以由第三方框架(如 Google...)支持。
5 分钟阅读
级数 12+32+52+⋯+(2*n−1)2 表示初始奇数的平方之和。序列中的每一项都是奇数的平方,从 1 开始,后一项增加 2。这个级数很有趣,因为:涉及的数字是奇数...
阅读 4 分钟
问题陈述给定一个二进制字符串,我们需要找到给定二进制字符串中 0 和 1 的最大差值。在这里,我们将 0 视为 +1,将 1 视为 -1,然后寻找连续子数组的最大值。这个子数组的最大和……
阅读 4 分钟
? 在 Java 中,我们使用数组来存储相同数据类型的元素。有时需要声明一个空数组,或者在不使用任何值对其进行初始化的情况下生成一个数组。在本节中,我们将学习如何声明一个空数组...
5 分钟阅读
涉及根据二叉树的根节点的水平距离,按列组织和打印二叉树的节点。使用 TreeMap 和层序遍历,节点按垂直顺序分组和显示,确保树的结构化视图。输入:一个具有……
14 分钟阅读
Two Sum - Pairs with Zero Sum 是另一个算法问题,也称为识别数组中和为零的整数对的问题。这个问题在编码面试和竞争性编程中非常普遍,因为它不仅需要...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India