有向图的拓扑排序或拓扑排序是其顶点的线性排序,这样对于从顶点u到顶点v的每个有向边UV,在该排序中u都位于v之前。这仅在有向图中有意义。
在很多地方,拓扑排序很有意义。例如,假设您正在遵循一个食谱,在这个食谱中,必须执行一些步骤才能进行下一步。但是其中一些可以并行执行。以类似的方式,在大学期间选择课程时,存在一些高级课程的先决条件,而这些高级课程本身可能是进一步课程的先决条件。例如-
/** * CS101 CS102 * / \ / * CS204 CS340 * \ /| \ * CS380 | CS410 * \ | / * CS540 */
在上图中,考虑是否要在一个级别上学习该课程,您必须首先从其上一个级别开始学习与该课程相关的所有课程。以下是上图的一些可能的拓扑排序-
CS101 -> CS204 -> CS102 -> CS340 -> CS410 -> CS380 -> CS540 CS102 -> CS101 -> CS340 -> CS204 -> CS410 -> CS380 -> CS540
让我们在JavaScript中实现它。我们将编写2个函数,拓扑排序和topologicalSortHelper,以帮助递归标记和浏览图形。
topologicalSortHelper(node, explored, s) { explored.add(node); //将该节点标记为已访问,然后继续到节点 // that are dependent on this node, the edge is node ----> n this.edges[node].forEach(n => { if (!explored.has(n)) { this.topologicalSortHelper(n, explored, s); } }); //该节点的所有依赖关系都已解决,我们现在可以添加 //这到堆栈。 s.push(node); } topologicalSort() { //创建一个堆栈以按排序顺序跟踪所有元素 let s = new Stack(this.nodes.length); let explored = new Set(); //对于图中的每个未访问节点,请调用帮助程序。 this.nodes.forEach(node => { if (!explored.has(node)) { this.topologicalSortHelper(node, explored, s); } }); while (!s.isEmpty()) { console.log(s.pop()); } }
您可以使用以下方式进行测试:
let g = new Graph(); g.addNode("A"); g.addNode("B"); g.addNode("C"); g.addNode("D"); g.addNode("E"); g.addNode("F"); g.addNode("G"); g.addDirectedEdge("A", "C"); g.addDirectedEdge("A", "B"); g.addDirectedEdge("A", "D"); g.addDirectedEdge("C", "D"); g.addDirectedEdge("D", "E"); g.addDirectedEdge("E", "F"); g.addDirectedEdge("B", "G"); g.topologicalSort();
我们创建的图看起来像-
/** * A * / | \ * C | B * \ | | * D G * | * E * | * F */
输出结果
这将给出输出-
A B G C D E F
为了表明计算机科学家可以把任何东西变成一个图问题,让我们考虑做一批煎饼的问题。 菜谱真的很简单:1个鸡蛋,1杯煎饼粉,1汤匙油 和 3/4 杯牛奶。 要制作煎饼,你必须加热炉子,将所有的成分混合在一起,勺子搅拌。 当开始冒泡,你把它们翻过来,直到他们底部变金黄色。 在你吃煎饼之前,你会想要加热一些糖浆。 Figure 27将该过程示为图。 Figure 27 制作煎饼的困难是知道先做什么。从 Fi
一、拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。 这样说,可能理解起来比较抽象。下面通过简单的例子进行说明! 例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序
问题内容: 好的,因此在根据输入数据进行拓扑排序时,通常存在多个正确的解决方案,可以根据这些正确的解决方案对图进行“处理”,以便所有依赖项都位于“依赖”它们的节点之前。但是,我正在寻找稍微不同的答案: 假设以下数据: 和(必须先于并且必须先于)。 只有这两个限制,我们有多种候选方案:( ,, 等)。但是,我正在寻找一种将这些节点“分组”的方法,以便在处理完一组后,下一组中的所有条目都将处理其依赖项
拓扑排序主要解决的问题是给一个图的所有节点排序。 一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: (1)每个顶点出现且只出现一次。 (2)若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(
拓扑排序的英文名是 Topological sorting。拓扑排序要解决的问题是给一个图的所有节点排序。 一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: (1)每个顶点出现且只出现一次。 (2)若存在一条从顶点 A 到顶点 B 的路径,那
据我所知,如果您有一个现成的高效黑盒方法来处理强连接组件,那么进行拓扑排序的一种方法是: (假设-无自循环) null 我只想确保我正确理解事情。