拓扑排序两种实现方式

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

拓扑排序能解决的问题

在一个项目中会有很多源代码文件。编译器在编译代码的时候需要按照依赖关系,依次编译每个源文件。例如A.java依赖B.java,那就需要先编译B.java,再编译A.java。要想完整编译整个项目就需要确定一个全局的编译顺序。确定这样一个全局的编译顺序就用到拓扑排序。

拓扑排序就是解决有向无环图的图中所有顶点的满足依赖条件的顶点顺序

解决思路

可以将每个源文件看做一个顶点,源文件和源文件之间的依赖关系看做一条边。图的基本结构如下。


public class Graph {private int v; // 顶点的个数private LinkedList<Integer> adj[]; // 邻接表public Graph(int v) {this.v = v;adj = new LinkedList[v];for (int i=0; i<v; ++i) {adj[i] = new LinkedList<>();}}public void addEdge(int s, int t) { // s先于t,边s->tadj[s].add(t);}
}

排序算法有两种方式BFS和DFS。

BFS遍历

BFS遍历,也称为Khan算法。在构建图的时候如果A.java依赖B.java,那就从B到A有一条边:B->A。那入度为0的点就是最先编译的。 找到入度为0的顶点X,将其输出到拓扑排序结果列表中,然后删除以X为起点的所有的边。继续查找入度为0的顶点,添加到结果列表中。

	public List<Integer> topSortByKahn(){int[] inDegree = new int[v];for(int i = 0; i< adjacency.length; i++){for(Edge edge : adjacency[i]){inDegree[edge.tid] ++;}}Queue<Integer> queue = new LinkedList<>();for(int i=0;i<inDegree.length;i++){if(inDegree[i] == 0){queue.add(i);}}List<Integer> path = new ArrayList<>();while(! queue.isEmpty()){int node = queue.poll();path.add(node);for(Edge edge : adjacency[node]){inDegree[edge.tid]--;if(inDegree[edge.tid] == 0){queue.offer(edge.tid);}}}return path;}

DFS遍历

按照深度优先搜索的方式,遍历每个顶点。假如有条路径是:A->B->C->E、A->D->C。
DFS的时候,如果先走的是第一条要先访问了C、E才会访问D->C这条路线。这样的话,就不能找到C什么时候可以执行。所以需要将邻接矩阵转为逆邻接矩阵。
E->C->B->A、C->D->A。
说明A先执行了才能执行B,B、D先执行才能执行C,C执行了才能执行 E。这个顺序符合要求。

在DFS处理环节,把一个顶点所依赖的所有节点先输出,再输出本节点。

 	public List<Integer> topSortByDFS(){LinkedList<Integer>[] inverseAdg = new LinkedList[this.v];for(int i = 0; i< adjacency.length; i++){inverseAdg[i] = new LinkedList<>();}for(int i = 0; i< adjacency.length; i++){for(Edge edge : adjacency[i]){inverseAdg[edge.tid].add(edge.sid);}}boolean[] visited = new boolean[v];List<Integer> path = new ArrayList<>();for(int i=0;i<this.v;i++){if(visited[i] == false){dfs(i,inverseAdg,visited,path);}}return path;}private void dfs(int sid, LinkedList<Integer>[] inverseAdg, boolean[] visited,List<Integer> path) {visited[sid] = true;for(int tid   : inverseAdg[sid]){if(visited[tid] == false){dfs(tid,inverseAdg,visited,path);}}path.add(sid);}

完整代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter_http request的简单设置和应用

http request 协议、地址、端口号 参数类型 正则搜索 帮助文档 相等的关系 匹配正则的结果&#xff08;jmeter一般都用分组取想用的数据&#xff09; 转载于:https://www.cnblogs.com/rychh/articles/11087537.html

spring学习(46):spring的单例bean

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

943. Find the Shortest Superstring

目录题目描述暴力搜索分析暴力搜索优化动态规划参考链接题目描述 输入&#xff1a;字符串数组String[] A 输出&#xff1a;一个字符串result&#xff0c;A中每一个字符串是result的子串&#xff0c;并且reuslt是符合这个条件的最短的字符串。 举例&#xff1a; 输入: [“alex”…

install-info - 更新 info/dir 项

SYNOPSIS 总览 install-info [OPTION]... [INFO-FILE [DIR-FILE]] DESCRIPTION 描述 从 Info 目录文件 DIR-FILE 中的文件 INFO-FILE 中安装或删除 dir 目录项。 OPTIONS 选项 --delete删除 DIR-FILE 中的 INFO-FILE 里已有的项&#xff1b;不插入任何新项。--dir-fileNAME指定…

spring学习(47):bean的作用域

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

visual studio 2017 显示行号

1.Tools中选择Options...&#xff0c; Options界面中Test Editor -> All Languages&#xff08;当然也可以设置对应的语言&#xff09; -> General&#xff0c; 在Settings中勾选 Line numbers。 2.行号就显示出来了&#xff0c;便于我们去定位代码。 转载于:https://www…

spring学习(48):自动装配中定义的bean的作用域

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

212. Word Search II:多个单词查找

写在前面&#xff1a;这两周持续看花花酱整理的题目列表和视频讲解&#xff0c;也得益于自己持续多年刷题&#xff0c;今天刷这道题目的想法是&#xff1a;会trie树居然就能攻克hard题目&#xff01;我也离独立攻破hard题目不远了嘛。前段时间看王争在极客时间的系列课程&#…

CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构区别...

神经网络技术起源于上世纪五、六十年代&#xff0c;当时叫感知机&#xff08;perceptron&#xff09;&#xff0c;拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层&#xff0c;在输出层得到分类结果。早期感知机的推动者是Rosenblatt。&#xff08;扯…

在mybatis中调oracle dblink存储过程

写在前面&#xff1a;在mybatis中操作oracle的数据&#xff0c;不复杂&#xff0c;也不困难。只是第一次用&#xff0c;入了很多坑&#xff0c;记录一下。在此之前需要一些简单的配置&#xff0c;此前一篇博客已经做了简单叙述&#xff1a; https://www.cnblogs.com/studentc/p…

spring学习(49):javaconfig里面定义bean的作用域

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

675. Cut Off Trees for Golf Event

这道题目最大的难点是理解题意。 文章目录题目理解题目理解 输入&#xff1a;一个非负的二维数组 输出&#xff1a;一个最短距离 规则&#xff1a;数组中的元素如果是0&#xff0c;表示障碍&#xff0c;不能通过。如果是1&#xff0c;表示可以行走的地面。如果大于1表示树的高…

spring学习(50):延迟加载

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

ansible的错误

错误 [rootbogon ansible]# ansible test -m ping 192.168.16.155 | FAILED! > { "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this hosts finger…

spring学习(51):对象的初始化和销毁

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

282. Expression Add Operators

目录题目理解分析第一步&#xff1a;dfs获得所有表达式第二步&#xff1a;计算结果先计算加减法计算乘法时间复杂度进一步优化题目理解 输入&#xff1a;一个字符串num&#xff0c;一个int target。输入num只包含数字。 规则&#xff1a;可以给num中包含的数字之间任务添加二目…

ubuntu下的对拍

开始用ubuntu祭blog 转载于:https://www.cnblogs.com/123789456ye/p/11094192.html

spring学习(52):工厂方法创建bean对象

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

花花酱leetcode 题目——搜索专题

在刷完极客时间的算法题目之后&#xff0c;偶然看到了花花酱关于leetcode进入千题时代的一些刷题看法。决定跟着他的思路继续刷题。 要刷多少题 1 每个类型 10-20 如何刷题 1 同类型题目一起刷 2 看代码很重要&#xff0c;看至少3-5种不同实现 3 第一遍&#xff1a;5分钟想…

P2058 海港

P2058 海港 题解 这道题就是给出你n艘船&#xff0c;让你看看以当前船停靠时间为截止时间&#xff0c;24h以内乘客来自多少不同的国家 一开始会想到来一艘船就记录下本船的到达时间&#xff0c;到达人数&#xff0c;以及乘客的国籍 但是你会发现这很占空间 而且船只进来的顺序都…