拓扑排序(java)

算法精解:DAG有向无环图 本文循序渐进地从图到有向图到有向无环图,详细地介绍了相关术语,api代码实现,也补充入了背包和栈的代码实现,重点研究了图的深度优先搜索算法以及寻找有向环算法。最后对DAG和区块链的关系进行了简介,希望随着技术发展,DAG有望成为真正的区块链3.0。 阅读详情

拓扑排序

        对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点(每一个顶点出现且只出现一次)排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前(换言之,若顶点u在序列中排在顶点v的前面,则在图中不存在从顶点v到顶点u的路径)。

算法描述:

第一步:从DAG图中选择一个没有前驱(入度为零)的顶点输出

第二步:从图中删除该顶点,以及所有以它为起点(弧尾)的边

第三步:重复第一步和第二步的步骤直到DAG图为空,或者当前图中不存在无前驱的顶点为止,后一种情况则说明此有向图中存在环

package ccnu.offer.graph;

import java.util.ArrayList;
import java.util.Stack;

public class Demo03 {
	public static void main(String[] args) {
		int vertexNum = 5;
		char[] vertexs = { 'a', 'b', 'c', 'd', 'e' };
		int[][] matrix = { { 0, 1, 1, 0, 1 }, 
						   { 0, 0, 1, 0, 0 }, 
						   { 0, 0, 0, 1, 0 }, 
						   { 0, 0, 0, 0, 0 },
						   { 0, 0, 0, 1, 0 } };
		Graph g = new Graph(vertexNum, vertexs, matrix);
		for(char ch : topologicalSort(g)){
			System.out.print(ch);
		}
	}

	// 对有向无环图DAG(Directed Acyclic Graph)图的排序,AOV(Activity On Vertex)网即DAG图表示一个工程,那么其顶点表示活动
	public static ArrayList<Character> topologicalSort(Graph g) {
		ArrayList<Character> topologySerials = new ArrayList<Character>();
		int[] inDegree = getInDegree(g);
		Stack<Integer> s = new Stack<Integer>(); // 这是用来存放当前图中入度为零的顶点的容器(不一定要用栈,队列、List等都行)
		for(int i = 0; i < inDegree.length; i++){
			if(inDegree[i] == 0){ // 所有无前驱顶点的顶点入栈
				s.push(i);
			}
		}
		while(!s.isEmpty()){
			int v = s.pop();
			topologySerials.add(g.vertexs[v]);
			for(int i = 0; i < g.matrix.length; i++){
				if(g.matrix[v][i] != 0){ // 顶点i的前驱为顶点v
					if(--inDegree[i] == 0){ // 顶点i已无前驱
						s.push(i);
					}
				}
			}
			
		}
		return topologySerials;
	}
	
	public static int[] getInDegree(Graph g) {
		int[] inDegree = new int[g.vertexNum];
		for (int i = 0; i < g.matrix.length; i++) {
			for (int ii = 0; ii < g.matrix.length; ii++) {
				if (g.matrix[ii][i] != 0) {
					inDegree[i]++;
				}
			}
		}
		return inDegree;
	}

	private static class Graph {
		private int vertexNum;
		private char[] vertexs;
		private int[][] matrix;

		public Graph(int vertexNum, char[] vertexs, int[][] matrix) {
			this.vertexNum = vertexNum;
			this.vertexs = vertexs;
			this.matrix = matrix;
		}
	}
}

Java实现拓扑排序 1 问题描述 给定一个有向图,求取此图的拓扑排序序列。 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面。 2 解决方案 2.1 基于减治法实现 实现原理:不断地做这样一件事,在余下的有向图中求取一个源(source)(PS:定义入度为0的顶点为有向图的源),它是一个没有输入边的顶点,然后把它和... 阅读详情

相关推荐

JAVA实现拓扑排序

折腾了很久才实现的拓扑排序,把代码和思路整理一下: 拓扑排序是用来对有向无环图进行排序的,和图的广度优先遍历类似,主要是利用队列把节点的入度为0(就是没有指向该节点的节点,只有从节点发出的)的元素入队,然后 1:将队首元素出队输出并寻找该元素的所有相邻元素的节点, 2:对这些节点的入度-1,并检查是否有入度减为0的,如有,则入队。 重复上述操作直到队列为空为止。 容易出问

qq_20991785的专栏 2161

【Java项目】基于DAG的任务编排框架/平台

最近在做的工作比较需要一个支持任务编排工作流的框架或者平台,这里记录下实现上的一些思路。任务编排工作流任务编排是什么意思呢,顾名思义就是可以把 "任务" 这个原子单位按照...

qq_18244417的博客 1万+

Java拓扑排序

拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从Vi到Vj的路径,那么在排序中Vj就在Vi的后面。 下面是课程先修结构(course prerequisite structure)的无圈图。有向边(v,w)表明课程v必须在课程w选修前修完。这些课程的拓扑排序是不破坏课程结构要求的任意的课程序列。 显然,如果图含有圈,那么拓扑排序是不可能的,因为对于圈上的两个顶点v和w,v先于

杨春建的博客 1418

(Java)数据结构——图(第八节)有向无环图(DAG图)以及DAG描述表达式

本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。

m0_60631836的博客 1059

java实现简单的Dag图

基于java进行的实现简单Dag图;附件中包含java根据配置的dagJson。1实现了filter过滤,返回指定的字段;2实现了按指定字段排序,返回指定的字段;可以自己添加mysql、Oracle、redis、hive、es、sparksql、clickhouse等存储进来运算

UE5热更新(通过Pak包加载关卡资源,并添加到流关卡)

请先阅读我上一篇文章)**

xialuhui的博客 6456

Java DAG并行开源框架

Apache Beam:Beam是一个统一的编程模型,支持多个批处理和流处理引擎,如Apache Spark、Flink、Google Cloud Dataflow等。Java DAG并行开源框架指的是一种用于编写高性能、高可靠性、高可扩展性数据流处理程序的工具集,它提供了一系列算法和工具,帮助我们快速构建复杂的数据处理管道。Spring Batch:Spring Batch是一个轻量级、可扩展的批处理框架,提供了丰富的特性和API,包括运行状态管理、事务管理、异常处理等。

weixin_35843253的博客 1204

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1327

后端 绘制有向无环图(DAG图)

java绘制DAG

mizuhokaga的博客 2405

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

基于浏览器插件的拼多多买家订单导出方法

基于浏览器插件的拼多多买家订单导出方法

2501_93542170的博客 1718

Java中的拓扑排序

Java中的拓扑排序 弗拉基米尔·巴托坎宁(VladimirBatoćanin)•0评论 介绍 穿衣服时,就像您一样,您很可能没有以下思路: 哦,穿上裤子先穿好内裤可能是个好主意。 这是因为我们习惯于按拓扑对动作进行排序。或更简单地说,我们习惯于从逻辑上推断哪些动作必须在其他动作之前或之后执行,或者哪些动作是其他动作的先决条件。 例如,假设您要盖房子,步骤将如下所示: 奠定基础 用装置建造墙 放入绝缘层 摆放装饰品/门面 按照确切的顺序-这是无可争议的。如...

allway2的博客 2481

OSCP-1-3-natraj(本地文件包含、日志中毒、apache2配置漏洞、nmap提权)

像往常一样,我们将使用“Netdiscover”工具识别主机的 IP。所以,让我们首先用 nmap 列出所有 TCP 端口。我们从访问web服务(80端口)开始,在那里我们找到了几张关于Natraj的图片和信息,我们将查看源代码和robots.txt,似乎没有什么有用的。(或至少,目前)。因此,让我们继续进行。在 Dirb 及其默认字典的帮助下,我们找到了一个名为“”的目录。我们进入并列出一个名为“”的文件:如果我们执行它,我们会看到它什么也不做。我们可能需要添加其他内容。

墨痕诉清风的博客 529

【Java】拓扑排序

java实现拓扑排序

rellvera的博客 3570

ShardingSphere 分库分表避坑:扩容数据迁移时,如何做到“不停机、不丢数据”?

停机:发布公告,凌晨 0 点停止对外服务。洗数据:跑一个巨大的脚本,把旧库数据 Hash 算出新路由,写入新库。改配置:修改代码里的分片规则。重启:祈祷数据没丢,服务正常。这种“刀耕火种”的方式,风险极高,且随着数据量增大,停机时间会变得不可接受。我们需要的是Online Migration (在线迁移)。分库分表扩容不再是“听天由命”的赌博。通过,我们将一次高风险的“运维操作”变成了一个可控的、可视化的“数据流转过程”。方案停机时间复杂度回滚难度传统停机清洗。

BUG猿的博客 883

FreeRTOS深入教程(任务创建的深入和任务调度机制分析)

本篇文章将带大家深入学习任务的创建和分析任务调度的机制。本篇文章深入的讲解了任务创建的内部实现和任务调度的源代码分析和实现,学习这篇文章有助于更深入的学习FreeRTOS的源码。

m0_49476241的博客 6391

拓扑排序(Topologicalsort)之Java实现

拓扑排序算法介绍 拓扑排序解决的是一系列相互依赖的事件的排序问题,比如Ant中有很多的Task,而某些Task依赖于另外的Task,编译之前需要清理空间,打包之前要先编译,但其它一些Task处理顺序可以调换(是无所谓前后,不是并行), 如何安排Task的执行顺序就可以用拓扑排序解决。熟悉Java的朋友应该都知道Spring,一个非常优秀的解决组件(Bean)依赖的框架,组件之间可能有依赖关系,也

永无止境,上下求索 2万+

fanuc机器人KAREL程序间参数的传递

之前的课程中讲述过KAREL程序中函数参数的传递,而控制工业机器人的动作只能通过控制TP程序来实现,所以在实际应用中就会出现在不同程序间进行参数的传递。尤其是对于有模块化编程的思想的设计者,更有这种迫切的要求。所以本次课程来讲解一下如何实现在不同程序之间进行参数的传递。 本次课程分为两个部分,以讲解在不同类型程序间进行参数传递的实现方式。 1、TP程序之间传递参数; 2、TP与PC程序之间传递参数。

haier123888的博客 2696

拓扑排序的实现java_java实现-拓扑排序

import java.util.Stack;//拓扑排序public class GraphTopologic {private int numVertexes;private VertexNode[] adjList;//邻接顶点的一维数组public GraphTopologic(int numVertexes){this.numVertexes = numVertexes;}//拓扑排序...

weixin_36368404的博客 242

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

拓扑排序所有可能java_图的拓扑排序总结-java版

目录AOV网拓扑排序简介拓扑排序算法java实现拓扑排序测试AOV网AOV网表示一个有向图中顶点,用弧表示顶点之间的优先关系。如下图所示,在AOV网中,若从顶点vi到顶点vj之间存在一条有向路径,则称顶点vi为顶点vj的前驱,顶点vj为顶点vi的后继。注意,AOV图不能有回路,否则会将序列陷入死循环,称为死锁。拓扑排序简介所谓拓扑排序,其实就是对一个有向图构造拓扑序列的过程。可以把一条边,当做是一...

weixin_34902728的博客 498

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

拓扑排序 Java

Java 拓扑排序减一法(入度删除法)

m0_63911891的博客 1657

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

拓扑排序之java实现_拓扑排序(三)之 Java详解 - 如果天空不死

前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序。目录1.拓扑排序介绍2.拓扑排序的算法图解3.拓扑排序的代码说明4. 拓扑排序的完整源码和测试程序拓扑排序介绍拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。这样说,可能理解起来比较抽象。下面通过简单的...

weixin_42509888的博客 577

图的拓扑排序总结-java版

目录 AOV网 拓扑排序简介 拓扑排序算法 java实现 拓扑排序 测试 AOV网 AOV网表示一个有向图中顶点,用弧表示顶点之间的优先关系。如下图所示,在AOV网中,若从顶点vi到顶点vj之间存在一条有向路径,则称顶点vi为顶点vj的前驱,顶点vj为顶点vi的后继。注意,AOV图不能有回路,否则会将序列陷入死循环,称为死锁。 拓扑排序简介 所谓拓扑排序,其实就是对一...

今天吃了吗的博客 1459

拓扑排序及其Java实现

拓扑排序是针对有向无圈图的顶点的一种排序,使得如果存在一条从A到B的路径,那么在排序中A必定在B的前面。 拓扑排序的应用场景很好理解,比如在内存中运行着很多任务,某个任务A的执行依赖于另外一个任务B,那么在A执行完之前,B一定不能被清理。而另外一些任务是没有关联的,如何来安排这些任务被清理的顺序就需要依赖拓扑排序。 一个简单的拓扑排序的方案(Kahn算法)是:先找出任意一个没有

Maxwell_7 9897

java拓扑排序实现源码

java之拓扑排序实现 因为毕业设计是做的关键路径之前导图实现,所以查了一些资料,发现第一步是做拓扑排序。这篇文章就是关于拓扑排序,用到了简单的面向对象思想- - 这个是节点的bean,其中一些属性暂时没有用到,是为后面做关键路径用的 package main; import java.util.List; /** * @Title:java拓扑排序 * @Author:Ted

请问如何把我的名字弄长啊 578
上一篇: 迪杰斯特拉(Dijkstra)算法求解单源最短路径及其相应长度(java实现)
下一篇: 关键路径过程详解、算法及其实现
mlee1018
博客等级 码龄12年 36粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值