爪哇中的拓扑排序
在这篇文章中,我们将在图中看到有关拓扑排序的信息。
拓扑排序是顶点或节点的排序,例如,如果(u,v)之间存在边,那么在拓扑排序中u应该先于v。拓扑排序仅适用于有向无环图(DAG)。如果图中有一个周期,那么就赢了’不可能进行拓扑排序。
拓扑排序示例
让’借助示例了解。
您可能已经使用过maven作为构建工具。如果您在maven中具有多个模块,则maven会基于依赖关系来构建项目。
让’s说您有4个Maven模块。
- Maven模型
- Maven业务逻辑
- mavan-util
- Maven-ui
现在您需要在maven-business-logic之前构建maven-model,因为maven-business-logic使用来自maven-model的代码。
类似地,由于maven-ui依赖于所有三个模块,因此应在maven-ui之前构建maven-model,maven-business-logic和maven-util。
因此,在这种情况下,我们可以计算拓扑排序,以便maven可以按正确的顺序构建它们。
拓扑排序算法
请注意,拓扑排序可以有多个解决方案。
让’在这里拾取节点30。
- 节点30取决于节点20和节点10。
- 节点10取决于节点20和节点40。
- 节点20取决于节点40。
因此,在拓扑排序中,节点10,节点20和节点40应该位于节点30之前。
此算法是 深度优先搜索。在深度优先搜索中,我们首先打印顶点,然后转到其邻居,但是在拓扑排序的情况下,我们不’不要立即打印顶点,而是将其推入堆栈。
在拓扑排序中,我们将有一个临时堆栈。我们不会立即打印该顶点,我们首先对其所有相邻顶点递归调用拓扑排序,然后将其推入堆栈。完成递归拓扑排序后,我们将打印堆栈。
为什么有效?
之所以起作用,是因为当您将任何节点推入堆栈时,您已经推入了其邻居(及其邻居等),因此没有任何依赖关系的节点将位于堆栈的顶部。在我们的例子中,我们将在堆栈顶部放置40个。
爪哇程序实现拓扑排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
包 组织.Arpit.爪哇2blog; 进口 爪哇.实用程序.数组列表; 进口 爪哇.实用程序.清单; 进口 爪哇.实用程序.叠放; 上市 类 拓扑排序 { 叠放<节点> 叠; 上市 拓扑排序() { 叠=新 叠放<>(); } 静态的 类 节点 { 整型 数据; 布尔值 参观过; 清单<节点> 邻居; 节点(整型 数据) { 这个.数据=数据; 这个.邻居=新 数组列表<>(); } 上市 虚空 邻居(节点 邻居节点) { 这个.邻居.加(邻居节点); } 上市 清单<节点> 得到Neighbours() { 返回 邻居; } 上市 虚空 setNeighbours(清单<节点> 邻居) { 这个.邻居 = 邻居; } 上市 串 toString() { 返回 ”+数据; } } //递归拓扑排序 上市 虚空 拓扑排序(节点 节点) { 清单<节点> 邻居=节点.得到Neighbours(); 对于 (整型 i = 0; i < 邻居.尺寸(); i++) { 节点 n=邻居.得到(i); 如果(n!= 空值 && !n.参观过) { 拓扑排序(n); n.参观过=真正; } } 叠.推(节点); } 上市 静态的 虚空 主要(串 精氨酸[]) { 拓扑排序 拓扑结构 = 新 拓扑排序(); 节点 节点40 =新 节点(40); 节点 节点10 =新 节点(10); 节点 节点20 =新 节点(20); 节点 节点30 =新 节点(30); 节点 节点60 =新 节点(60); 节点 节点50 =新 节点(50); 节点 节点70 =新 节点(70); 节点40.邻居(节点10); 节点40.邻居(节点20); 节点10.邻居(节点30); 节点20.邻居(节点10); 节点20.邻居(节点30); 节点20.邻居(节点60); 节点20.邻居(节点50); 节点30.邻居(节点60); 节点60.邻居(节点70); 节点50.邻居(节点70); 系统.出.打印(“拓扑排序顺序:”); 拓扑结构.拓扑排序(节点40); //打印堆栈内容 叠放<节点> resultStack=拓扑结构.叠; 而 (resultStack.空的()==假) 系统.出.打印(resultStack.流行音乐() + ”); } } |
当您运行上述程序时,将获得以下输出:
40 20 50 10 30 60 70
时间复杂度
它与深度优先搜索非常相似,只是有一个额外的堆栈。所以是 时间复杂度 是O(V + E)
。那’关于Java中的拓扑排序的全部内容。