数据结构之拓扑排序和关键路径
数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构和 非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
1、AOV 网
在工程领域,一个大的工程项目通常被划分为许多较小的子工程(称为活动)。显然,当这些子工程都完成时,整个工程也就完成了。在有向图中,若以顶点表示活动,用有向边表示活动之间的优先关系,则称这样的有向图为以顶点表示活动的网(Activity On Vertex network,AOV 网)。在 AOV 网中,若从顶点vi到顶点vj有一条有向路径,则顶点vi是vj的前驱,顶点vj是vi的后继。若<vi,vj>是网中的一条弧,则顶点vI是vj的直接前驱,顶点vj是vi的直接后继。AOV 网中的弧表示了活动之间的优先关系,也可以说是一种活动进行时的制约关系。
在 AOV 网中不应出现有向环,若存在,则意味着某项活动必须以自身任务的完成为先决条件,显然这是荒谬的。因此,若要检测一个工程是否可行,首先应检查对应的AOV网是否存在回路。不存在回路的有向图称为有向无环图,或DAG(Directed Acycline Graph)图。检测的方法是对有向图构造其顶点的拓扑有序序列。若图中所有的顶点都在它的拓扑有序序列中,则该 AOV 网中必定不存在环。
2、拓扑排序及其算法
拓扑排序是将 AOV网中的所有顶点排成一个线性序列的过程,并且该序列满足:若在AOV网中从顶点vi到vj有一条路径,则在该线性序列中,顶点vi必然在顶点vj之前。
一般情况下,假设 AOV 图代表一个工程计划,则 AOV 网的一个拓扑排序就是一个工套顺利完成的可行方案。对 AOV 网进行拓扑排序的方法如下。
(1)在AOV网中选择一个入度为0(没有前驱)的顶点且输出它。
(2)从网中删除该顶点及与该顶点有关的所有弧。
(3)重复上述两步,直到网中不存在入度为0的顶点为止。
执行的结果会有两种情况:一种是所有顶点已输出,此时整个拓扑排序完成,说明网中不存在回路;另一种是尚有未输出的顶点,剩余的顶点均有前驱顶点,表明网中存在回路,拓排序无法进行下去。对于下图(a)所示的有向无环图进行拓扑排序,得到的拓扑序列为6,1,4,3,2,5。
当有向图中无环时,也可以利用深度优先遍历进行逆拓扑排序。由于图中无环,从图中某点出发进行深度优先遍历时,最先退出 Dfs函数的顶点即是出度为0的顶点,它是拓扑有序序列中最后的一个顶点。由此,按退出 Ds函数的先后顺序记录下来的顶点序列即为逆向的拓扑有序序列。拓扑排序算法的时间复杂度为 O(n+e)。
3、AOE 网
若在带权有向图G中以顶点表示事件,以有向边表示活动,以边上的权值表示该活动持续的时间,则这种带权有向图称为用边表示活动的网(Activity On Edge network,AOE 网)。通常在 AOE 网中列出了完成预定工程计划所需进行的活动、每项活动的计划完成时间、活动开始或结束的事件以及这些事件和活动间的关系,从而可以分析该项工程是否实际可行并估计工程完成的最短时间,以及影响工程进度的关键活动;进一步可以进行人力、物力的调度和分配,以达到缩短工期的目的。
在用 AOE 网表示一项工程计划时,顶点所表示的事件实际上就是某些活动已经完成、某些活动可以动工的标志。具体来说,顶点所表示的事件是指该顶点所有进入边所表示的活动均已完成、从它出发的边所表示的活动均可以开始的一种事件。
一般情况下,每项工程都有一个开始事件和一个结束事件,所以在 AOE 网中至少有一个入度为0的开始顶点,称为源点。另外,应有一个出度为0的结束顶点,称为汇点。AOE网中不应存在有向回路,否则整个工程无法完成。
与 AOV 网不同,AOE 网所关心的问题如下:
(1)完成该工程至少需要多少时间?
(2)哪些活动是影响整个工程进度的关键?
由于 AOE 网中的某些活动能够并行地进行,因此完成整个工程所需的时间是从开始顶点到结束顶点的最长路径的长度。这里的路径长度是指该路径上的权值之和。
4、关键路径和关键活动
在从源点到汇点的路径中,长度最长的路径称为关键路径。关键路径上的所有活动均是关键活动。如果任何一项关键活动没有按期完成,就会影响整个工程的进度,而缩短关键活动的工期通常可以缩短整个工程的工期。假设在n个顶点的 AOE 网中,顶点v0表示源点、顶点 vn-1表示汇点,则引入顶点事件的最早、最晚发生时间,活动的最早、最晚开始时间等概念。
(1)顶点事件的最早发生时间 ve(j)。ve(j)是指从源点v0到vj的最长路径长度(时间)。这个时间决定了所有从vj发出的弧所表示的活动能够开工的最早时间。
ve(j)计算方法为