拓扑排序和关键路径


拓扑排序
  一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。   所有的工程或者某种流程都可以分为若干个小的工程或者阶段,称这些小的工程或阶段为“活动”。
  这些子程序之间存在一定的约束,其中某种子工程的开始必须在另一些子工程完成之后。因此DAG图表示一个工程,其中有向边表示约束关系。这种有向图必须是无环的。如果出现了环(有向环),那么向前递推,环路上的任一子工程开始的先决条件必然是自己,显然矛盾的。如果设计出这样的工程图,工程无法进行。拓扑排序就是测试一个工程能否顺利进行。
【例】计算机专业的学生必须完成一系列规定的专业基础课和专业课才能毕业,这个过程就可以被看成是一个大的工程,而活动就是学习每一门课程。我们不妨把这些课程的名称与相应的代号列于表 7.2 。
表 7.2 计算机专业的学生必须完成课程的名称与相应代号
课程代号 课程名 先行课程名 课程代号 课程名 先行课程名
C 1 程序设计导论 无 C 9 算法分析 C 3
C 2 数值分析 C 1 , C 14 C 10 高级语言 C 3 , C 4
C 3 数据结构 C 1 , C 14 C 11 编译系统 C 10
C 4 汇编语言 C 1 , C 13 C 12 操作系统 C 11
C 5 自动机理论 C 15 C 13 解析几何 无
C 6 人工智能 C 3 C 14 微积分 C 13
C 7 计算机图形学 C 3 ,C 4 ,C 10 C 15 线性代数 C 14
C 8 计算机原理 C 4

  若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样的有向图称为 AOV(Activity On Vertex network) 网。在 AOV 网中,若从顶点 v i 到顶点 v j 之间存在一条有向路径,称顶点 v i 是顶点 v j 的前趋,或者称顶点 v j 是顶点 v i 的后继。若 是图中的弧,则称顶点 v i 是顶点 v j 的直接前趋,顶点 v j 是顶点 v i 的直接后继。
  这种优先关系可以用图 7.18 所示的有向图来表示。其中,顶点表示课程,有向边表示前提条件,若课程 v i 为课程 v j 的前行课,则必然存在有向边 &v i ,v j > 。

 

 

对 AOV 网进行拓扑排序的方法和步骤如下:


1. 从 AOV 网中选择一个没有前趋的顶点(该顶点的入度为 0 )并且输出它;
2. 从网中删去该顶点,并且删去从该顶点发出的全部有向边;

3. 重复上述两步,直到剩余网中不再存在没有前趋的顶点为止。

操作的结果有两种:
一种是网中全部顶点都被输出,这说明网中不存在有向回路,拓扑排序成功;
另一种是网中顶点未被全部输出,剩余的顶点均有前趋顶点,这说明网中存在有向回路,不存在拓扑有序序列。
【例】图 7.19 给出了一个 AOV 网实施上述步骤的例子。

这样得到一个拓朴序列 v 1 , v 6 , v 4 , v 3 , v 2 , v 5 。 
  为了避免在每一步选入度为零的顶点时重复扫描表头数组,利用表头数组中入度为零的顶点域作为链栈域,存放下一个入度为零的顶点序号,零表示栈底,栈顶指针为 top ,寄生在表头数组的入度域中的入度为零的顶点链表如图 7.20(b) 所示。


拓朴排序算法梗概如下:
1. 扫描顶点表,将入度为零的顶点入栈;
2.While ( 栈非空 )
{ 将栈顶点 v j 弹出并输出之;
在邻接链表中查 v j 的直接后继 v k ,把 v k 的入度减 1 ,若 v k 的入度为零则进栈;
}

算法的时间复杂度
  对一个具有 n 个顶点, e 条边的网来说,初始建立入度为零的顶点栈,要检查所有顶点一次,执行时间为 O(n) ;排序中,若 AOV 网无回路,则每个顶点入、出栈各一次,每个表结点被检查一次,因而执行时间是 O(n+e) 。所以,整个算法的时间复杂度是 O(n+e) 。

 

 

 

 

 

关键路径

  若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续时间),则此带权的有向图称为边表示活动的网 (Activity on Edge Network) ,简称 AOE 网。
【例】图 7.21 是一个网。其中有 9 个事件 v 1 , v 2 , … , v 9 ; 11 项活动 a 1 , a 2 , … , a 11 。每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。如 v 1 表示整个工程开始, v 9 表示整个工程结束。 V 5 表示活动 a 4 和 a 5 已经完成,活动 a 7 和 a 8 可以开始。与每个活动相联系的权表示完成该活动所需的时间。如活动 a 1 需要 6 天时间可以完成。

(1)AOV 网具有的性质 
⒈ 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。
⒉ 只有在进入某一顶点的各有向边所代表的活动都已经结束,该顶点所代表的事件才能发生。
⒊ 表示实际工程计划的 AOE 网应该是无环的,并且存在唯一的入度过为 0 的开始顶点和唯一的出度为 0 的完成顶点。
(2)由事件 v j 的最早发生时间和最晚发生时间的定义 , 可以采取如下步骤求得关键活动 :
1. 从开始顶点 v 1 出发 , 令 ve(1)=0, 按拓朴有序序列求其余各顶点的可能最早发生时间。
Ve(k)=max{ve(j)+dut()} ( 7.1 )
j ∈ T
其中 T 是以顶点 v k 为尾的所有弧的头顶点的集合 (2 ≤ k ≤ n) 。
如果得到的拓朴有序序列中顶点的个数小于网中顶点个数 n ,则说明网中有环,不能求出关键路径,算法结束。
2. 从完成顶点 v n 出发,令 vl(n)=ve(n) ,按逆拓朴有序求其余各顶点的允许的最晚发生时间 :
vl(j)=min{vl(k)-dut()}
k ∈ S
其中 S 是以顶点 v j 是头的所有弧的尾顶点集合 (1 ≤ j ≤ n-1) 。
3. 求每一项活动 a i (1 ≤ i ≤ m) 的最早开始时间 e(i)=ve(j) ;最晚开始时间
l(i)=vl(k)-dut()
。若某条弧满足 e(i)=l(i) ,则它是关键活动。

 


对于图 7.21 所示的 AOE 网,按以上步骤的计算结果见表 7.3 ,可得到 a 1 , a 4 , a 7 , a 8 , a 10 , a 11 是关键活动。

(3)求出 AOE 网中所有关键活动后,只要删去 AOE 网中所有的非关键活动,即可得到 AOE 网的关键路径。
  这时从开始顶点到达完成顶点的所有路径 都是关键路径。一个 AOE 网的关键路径可以不止一条,如图 7.21 的 AOE 网中有二条关键路径, ( v 1 , v 2 , v 5 , v 7 , v 9 ) 和 ( v 1 , v 2 , v 5 , v 8 , v 9 ) 它们的路径长度都是 16 。如图 7.24 所示。

注意:
  并不是加快任何一个关键活动都可以缩短整个工程完成的时间,只有加快那些包括在所有的关键路径上的关键活动才能达到这个目的。只有在不改变 AOE 网的关键路径的前提下,加快包含在关键路径上的关键活动才可以缩短整个工程的完成时间。

 

 

摘自:http://sjjg.js.zwu.edu.cn/SFXX/index.html

你可能感兴趣的:(软件开发)