您的位置:首页 > 编程语言 > Java开发

拓扑排序—java语言实现

2019-05-06 17:09 99 查看

拓扑排序是针对有向无圈图的顶点的一种排序,使得如果存在一条从A到B的路径,那么在排序中A必定在B的前面。

拓扑排序的应用场景很好理解,比如在内存中运行着很多任务,某个任务A的执行依赖于另外一个任务B,那么在A执行完之前,B一定不能被清理。而另外一些任务是没有关联的,如何来安排这些任务被清理的顺序就需要依赖拓扑排序。

一个简单的拓扑排序的方案(Kahn算法)是:先找出任意一个没有入边的顶点,然后打印该顶点,并将它及其边一起从图中剔除,然后对其余的部分继续这个操作。


代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Code_03_TopologySort {

// directed graph and no loop有向图而且没有环路(先决条件)
public static List<Node> sortedTopology(Graph graph) {
HashMap<Node, Integer> inMap = new HashMap<>();
Queue<Node> zeroInQueue = new LinkedList<>();
for (Node node : graph.nodes.values()) {// 遍历所有的点
inMap.put(node, node.in);// 所有点以及入度加入map
if (node.in == 0) {
zeroInQueue.add(node);// 当前入度为0的节点加入队列
}
}
List<Node> result = new ArrayList<>();
while (!zeroInQueue.isEmpty()) {// 入度为0的节点从队列弹出并且把加入list,相当于从图中去掉,所以还要把其邻接节点的入度减1
Node cur = zeroInQueue.poll();
result.add(cur);// 存的就是队列弹出的节点,就是拓扑排序的顺序
for (Node next : cur.nexts) {
inMap.put(next, inMap.get(next) - 1);
if (inMap.get(next) == 0) {
zeroInQueue.add(next);
}
}
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: