拓扑排序—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; }
相关文章推荐
- 拓扑排序的原理及其实现
- java语言实现 ALGO-90 出现次数最多的整数(算法训练)(两种解决方法)
- 转载 通过JAVA语言实现使用URL访问网络资源
- 拓扑排序的C++实现(邻接表存图)
- 邻接表实现的拓扑排序
- 用Java语言实现的各种排序
- 数据结构之---C语言实现拓扑排序AOV图
- JAVA语言实现机制
- 【算法】计算一篇文章的单词数(C、Java语言实现)
- Java语言实现简单FTP软件
- java语言实现号码归属地查询
- 拓扑排序(TopologicalSort) Java实现
- 对多个字符串进行排序,用Java语言实现,不能使用现有的类
- 用java语言实现汉诺塔的演示程序
- JAVA语言实现编译原理的LR分析过程模拟
- Java语言实现16进制数转换成2进制数,再由2进制数转换成8进制数(蓝桥杯训练)
- 使用Java语言实现,自己主动生成10个整数(1~100,求出生成数列中的最大值和最小值,不同意使用Arrays类的sort方法
- 【HDU 2647】Reward (邻接表实现拓扑排序,反向排序)
- 拓扑排序——JS+Echats实现
- 2106某某面试编程题:必须用Java语言实现,给出一个由元素数范围从0到N-1个唯一正整数组成的列表。设计一种方法,将该列表所有元素的元素值和其相应的索引值互换