数据结构关键路径_数据结构与算法之关键路径_一点课堂(多岸学院)
关键路径
梳理活动的顺序仅仅是拓扑排序可以完成的功能之一,更有价值的是估量完成整个事件的最短时间。比如生产一辆汽车,虽然安排员工、准备原始材料是先行条件,但是组装各种零部件是可以同时进行的,例如制造轮子和发动机、外壳等是可以同时进行的,这样可以大大减少生产时间。这种场景我们称为AOE网。
在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,称之为AOE网(Activity On Edge Network)。
我们的目标就是在这样的AOE网中,确定它的最短完成时间,而具备最短时间的路径就是关键路径。
把路径上各个活动所持续的时间之和称为路径长度,从起点到终点具有最大长度的路径叫关键路径,在关键路径上的活动叫关键活动。
那么我们怎么确定一个活动是不是关键活动呢?以做饭为例,我们可以同时烧水、炒菜和熬粥,其中烧水只需要3分钟,炒菜需要10分钟,熬粥需要20分钟。那么很显然至少需要20分钟才能完成全部工作,也就是说在这20分钟时间里,熬粥必须从一开始就进行,而烧水则可以从开始进行,也可以等17分钟后再进行,炒菜也可以从开始进行,或者最晚等10分钟后进行。这里没有空闲时间的活动就是关键活动。
例如下图就是一个AOE网,其中权值表示活动需要的时间:
以从v0->v3为例,假设权值表示的时间单位为分钟,可选的路径有v0->v1->v3,需要8分钟,或者v0->v2->v3,需要12分钟。要尽快到达v3,则v2必须一开始立刻启动,而v1可以在最开始,或者等待4分钟之后再启动,所以v0->v2->v3是关键路径。按照此方式,可以得到此AOE网的关键路径如下:
那么接下来,我们只需要确认每个顶点的最早开始时间和最晚开始时间,判断它们的时间差,如果没有时间差就是关键路径。
代码实现
首先,我们需要对AOE网进行拓扑排序,在排序的同时还可以得到每个顶点事件的最早发生时间,代码如下所示:
public boolean topoSort(ATGraph atGraph,int[] earlestTimeVertex,Stack> stack2) { int count = 0; Queue> queue = new LinkedList<>(); for (int i = 0; i < atGraph.getLen(); i++) { if (atGraph.getVertex(i).getIn() == 0) { queue.offer(atGraph.getVertex(i)); } } while (!queue.isEmpty()) { ATVertex vertex = queue.poll(); System.out.print(vertex.getData() + "->"); //将排序的数据push到stack2中 stack2.push(vertex); count++; //获取第一条边 ATEdge next = vertex.getNext(); while (next != null) { //获取 ATVertex nextVertex = next.getVertex(); nextVertex.setIn(nextVertex.getIn() - 1); if (nextVertex.getIn() == 0) { queue.offer(nextVertex); } // 计算每个顶点可以执行的最早时间 // 获取弧尾顶点下标 int topIndex = atGraph.getVertexIndex(vertex); // 获取弧头顶点下标 int index = atGraph.getVertexIndex(nextVertex); // 更新当前顶点可以发生的最早时间 if (earlestTimeVertex[topIndex] + next.getWeight() > earlestTimeVertex[index]) { earlestTimeVertex[index] = earlestTimeVertex[topIndex] + next.getWeight(); } next = next.getNext(); } } return count >= atGraph.getLen();}
现在我们得到了最早发生时间,并且将全部顶点按照访问的先后顺序压进了一个栈中,这是为了方便进行计算最晚发生时间。从前向后计算最晚发生时间是复杂的,但是反过来却很简单,对于最后一个顶点,它的最晚发生时间和最早发生时间一定一致,而它前面的顶点,就必须在此时间点之前完成。参考代码如下:
for (int i = 0; i < atGraph.getLen(); i++) { // 先将最晚发生时间都设置为最长时间 latestTimeVertex[i] = earlestTimeVertex[atGraph.getLen()-1];}// 从后向前,更新每个顶点的最晚发生时间while (!stack2.isEmpty()){ ATVertex vertex = stack2.pop(); ATEdge next = vertex.getNext(); while (next!=null){ ATVertex nextVertex = next.getVertex(); int nextIndex = atGraph.getVertexIndex(nextVertex); int index = atGraph.getVertexIndex(vertex); if (latestTimeVertex[nextIndex]-next.getWeight()
最后,只要按照顺序比对这两个时间是否相等,就可以得到完整的关键路径了,完整代码如下:
public void criticalPath(ATGraph atGraph){ Stack> stack2 = new Stack<>(); int[] earlestTimeVertex = new int[atGraph.getLen()]; int[] latestTimeVertex = new int[atGraph.getLen()]; topoSort(atGraph,earlestTimeVertex,stack2); for (int i = 0; i < atGraph.getLen(); i++) { // 先将最晚发生时间都设置为最长时间 latestTimeVertex[i] = earlestTimeVertex[atGraph.getLen()-1]; } // 从后向前,更新每个顶点的最晚发生时间 while (!stack2.isEmpty()){ ATVertex vertex = stack2.pop(); ATEdge next = vertex.getNext(); while (next!=null){ ATVertex nextVertex = next.getVertex(); int nextIndex = atGraph.getVertexIndex(nextVertex); int index = atGraph.getVertexIndex(vertex); if (latestTimeVertex[nextIndex]-next.getWeight() vertex = atGraph.getVertex(i); ATEdge next = vertex.getNext(); while (next!=null){ ATVertex nextVertex = next.getVertex(); int nextIndex = atGraph.getVertexIndex(nextVertex); lte = latestTimeVertex[nextIndex]-next.getWeight(); ete = earlestTimeVertex[i]; if (ete==lte){ System.out.println("路径:"+atGraph.getVertex(i).getData()+"->"+atGraph.getVertex(nextIndex).getData()+
数据结构关键路径_数据结构与算法之关键路径_一点课堂(多岸学院)相关推荐
- mysql cluster 读写分离_mysql数据库集群实现高可用读写分离_一点课堂(多岸学院)...
环境信息 操作系统:centos6.8 #mysql版本 mysql-community-client-5.7.25-1.el6.x86_64.rpm mysql-community-server-5 ...
- 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径
文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...
- 数据结构python版 答案,中国大学 MOOC_数据结构与算法Python版_章节测验答案
中国大学 MOOC_数据结构与算法Python版_章节测验答案 更多相关问题 认识的本质是()A.肯定世界是可知的B.主体对客体的能动反映C.主体对客体的直观反映D.实践是 水灰比是影响混凝土()的主 ...
- mooc数据结构与算法python版期末测验_中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案...
中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案 更多相关问题 采用fopen()函数打开文件,支持文件读取的参数有: [简答题]简单阐述高分子材料热-机械特征及成型加工的关系,并 ...
- 嵌入式团队培训_数据结构和算法概述
嵌入式团队培训_数据结构与算法概述 要求:理解并记忆即可,会求解算法的时间复杂度 一:数据结构 1.逻辑结构: 2.物理结构 3.抽象数据类型 二:算法 1.算法的五个基本特征: 2.算法设计的要求 ...
- 算法与数据结构_数据结构与算法专题--算法基本概念
很多开发者都知道"程序=数据结构+算法"这个著名的公式,并不真正明白算法的定义或概念.究竟什么是算法呢?从字面意义上理解,算法即用于计算的方法,通过这种方法可以达到预期的计算结果. ...
- a*算法的时间复杂度_数据结构(1)——算法和时间复杂度
Data Structure 1 算法和时间复杂度 01.什么是数据结构? 程序设计 = 数据结构 + 算法 数据结构是关系,是数据元素相互之间存在的一种或多种特定关系的集合. 数据结构和算法凌驾于任 ...
- 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析
这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正. 一.为何需要分析算法复杂度 挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法 ...
- python数据结构算法_数据结构与算法(Python)
数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...
- 数据结构视频教程 -《电子科技大学_罗吴蔓_数据结构》
整个视频打包下载地址:史上最全的数据结构视频教程系列分享之<电子科技大学_罗吴蔓_数据结构>,转载请保留出处和链接! 更多优秀资源请访问:我是码农 数据结构是计算机程序设计的重要理论技术基 ...
最新文章
- bind9.8 视图和日志功能
- Oracle 11g新特性之--只读表(read only table)
- Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程
- msc货物跟踪查询_运联研究 | 货物全程可视,能否真正消除物流信息盲点?
- scratch跳一跳游戏脚本_涂鸦骑士3D版强势屠榜,腾讯跳一跳“宝刀未老” | 休闲新游周报...
- 【渝粤教育】国家开放大学2018年春季 0699-21T阅读与写作 参考试题
- MySQL 修改字段
- 一次MySQL死锁问题解决
- 如何在SQL Server中分析存储子系统性能
- 为什么VS提示SurfFeatureDetector不是cv的成员函数
- linux安装安卓fastboot,Android的fastboot协议
- 数据库中的二维表—巧借Excel
- HTTP协议有关知识
- 宏的录制之工资条的制作
- 思科路由器IOS备份和恢复
- 什么是CRM系统,它如何支持客户营销管理?
- Landesk桌面管理之服务器管理篇
- Git基础-查看、添加、删除远程仓库链接
- 解决联想小新电脑使用vmware虚拟机蓝屏问题?
- 稀疏矩阵的存储方法(DOK、LIL、COO、CSR, CRS)
热门文章
- .NET SDK-Style 项目(Core、Standard、.NET5)中的版本号
- 云原生时代 给予.NET的机会
- 在.NET中使用DiagnosticSource
- 跟我一起学.NetCore之选项(Options)核心类型简介
- 译 | 在 Azure SQL 上节约成本的八种方法
- 微软开源 Tye 项目,可简化微服务开发
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
- .NET分布式大规模计算利器-Orleans(一)
- k8s集群部分常见问题处理
- 半天搭建你的Jenkins持续集成与自动化部署系统