Java中的拓扑排序
在本教程中,我们将看到图表中的拓扑排序。
拓扑排序是排序的顶点或者节点,诸如(U,V)之间存在边缘,然后U应该在拓扑分类中进行v。
仅针对导向的非循环图(DAG)可能是可能的拓扑排序。
如果图表中有一个循环,那么拓扑排序不会有任何可能性。
拓扑排序示例
让我们在一个例子的帮助下了解。
我们可能已将Maven用作构建工具。
如果我们在Maven中有多个模块,则基于依赖项的Maven构建项目。
让我们说你有4个maven模块。
- Maven-Model.
- Maven-Business-Logic
- Mavan-ilil.
- Maven-UI.
现在,我们需要在Maven-Business-Logic之前构建Maven-Model,因为Maven-Business-Logic使用Maven-Model的代码。
如Simiriarly,Maven-Model,Maven-Business-Logic和Maven-Util应该在Maven-UI之前构建,因为Maven-UI取决于所有三个模块。
因此,在这种情况下,我们可以计算拓扑排序,以便Maven可以以正确的顺序构建它们。
拓扑排序算法
请注意,拓扑排序可能有多个解决方案。
让我们在这里拾取节点30。
- 节点30取决于节点20和节点10.
- 节点10取决于节点20和节点40。
- 节点20取决于节点40。
因此,节点10,节点20和节点40应该在节点30之前拓扑分类。
该算法是深度首先搜索的变体。
在第一次搜索中,我们首先打印顶点,然后转到其邻居,但在拓扑排序的情况下,我们不立即打印顶点,而是将其推向堆栈。
在拓扑分类中,我们将有一个临时堆栈。
我们不会立即打印顶点,我们首先递归地称呼所有邻居顶点的拓扑排序,然后将其推向堆叠。
我们将在使用递归顶部排序完成后打印堆栈。
为什么它有效?
它有效,因为当我们将任何节点推到堆栈时,我们已经推出了邻居(以及他们的邻居等),因此没有任何依赖性的节点将位于堆栈的顶部。
在我们的情况下,我们将在堆栈的顶部有40个。
Java计划实现拓扑排序
package org.igi.theitroad; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class TopologicalSort { Stack<Node> stack; public TopologicalSort() { stack=new Stack<>(); } static class Node { int data; boolean visited; List<Node> neighbours; Node(int data) { this.data=data; this.neighbours=new ArrayList<>(); } public void addneighbours(Node neighbourNode) { this.neighbours.add(neighbourNode); } public List<Node> getNeighbours() { return neighbours; } public void setNeighbours(List<Node> neighbours) { this.neighbours = neighbours; } public String toString() { return ""+data; } } //Recursive toplogical Sort public void toplogicalSort(Node node) { List<Node> neighbours=node.getNeighbours(); for (int i = 0; i < neighbours.size(); i++) { Node n=neighbours.get(i); if(n!=null && !n.visited) { toplogicalSort(n); n.visited=true; } } stack.push(node); } public static void main(String arg[]) { TopologicalSort topological = new TopologicalSort(); Node node40 =new Node(40); Node node10 =new Node(10); Node node20 =new Node(20); Node node30 =new Node(30); Node node60 =new Node(60); Node node50 =new Node(50); Node node70 =new Node(70); node40.addneighbours(node10); node40.addneighbours(node20); node10.addneighbours(node30); node20.addneighbours(node10); node20.addneighbours(node30); node20.addneighbours(node60); node20.addneighbours(node50); node30.addneighbours(node60); node60.addneighbours(node70); node50.addneighbours(node70); System.out.println("Topological Sorting Order:"); topological.toplogicalSort(node40); //Print contents of stack Stack<Node> resultStack=topological.stack; while (resultStack.empty()==false) System.out.print(resultStack.pop() + " "); } }
运行上面的程序时,我们将得到以下输出:
Topological Sorting Order: 40 20 50 10 30 60 70
时间复杂性
与另外的堆栈相似,非常类似于深度搜索。
所以它的时间复杂性是O(v + e)。