DAG(Directed Acyclic Graph简称DAG),就是有向无环图,DAG这种图中的所有边都是有向边,而且从任意一个顶点开始,都找不到回到起始点的环路。

我也不免俗,举一个例子见下图:

dag图中 exchange含义 SPARK_权重

我们可以对某些,记住是某些DAG图进行排序:称为拓扑排序。记住,是某些图。
至于为什么要排序(或者说排序有什么用),网上很多资料都有解释(比如要自学某一个课程,可能要首先自学其他很多门必备的基础课程,拓扑排序可以安排你的学习流程),不再赘述。
所谓拓扑排序,就是把DAG图的各个节点按照一定的次序输出,并且保证输出序列的次序和顶点之间的先后次序一致。比如节点i----->节点j,那么输出序列中,i必须在j之前。
很熟悉的感觉吧。让我们想起了有向图的遍历,其实有向图的深度和广度遍历的过程,都是一次拓扑排序的过程。
我们知道,遍历的开始节点可以任意选,但是拓扑排序的起始节点则不能任意选,比如,上面的图中,我们不能选节点7以外的节点开始排序,这将导致节点7的前驱节点排在节点7之后。
同时,因为选择起始节点可能不同,还有算法也可能不同(比如排序时候选下一个节点的的nextNBr函数的结果不同:见我的gitee代码),拓扑排序的结果也必然不是唯一的。
从上面的讨论我们也可以得出一个结论:一个可以进行拓扑排序的DAG图的基本特征,必然存在至少一个入度为0的节点,如此才可以排序.

其实,上面我们讨论的,符合一定条件的DAG图就是AOV网(Active on vertices):中文翻译就是:用顶点表示活动的网络。
此处补充说明一下,数据结构中,好像大部分教材将网定义为:边具有权重的图。而有的书则说:有向图就是网。从AOV的特征来看,拓扑排序不涉及边的权重,因此对于网的定义,需要再次查找资料确认。

DAG的另一个应用就是AOE网。

AOE和AOV名字相近,含义却不一样(其实什么含义都是人为赋予的),AOE:就是Active on Edges,用边表示活动的网。既然名字这么规定,说明AOE的边有特殊性,比如边的权重参数能就比较重要,举例来说:

比如我们要做饭,从开始那一刻,就要处理很多事情(事件),而每一个事件,都要花费时间。这里,用顶点表示事件开始,用边表示处理这个事件的过程,所花费的时间用边的权重表示(当然,地图导航也比较符合AOE的性质,比如多对人马分别走不同的道路行动,最终汇合在一起),而且,我们在烧水的时候,还可以同时做洗菜,备调料等事件和过程,这些事件和过程,用顶点,边来描述,就是一个有AOE网,最终我们会用这个AOE网络计算出:饭菜做好至少需要多久。看下图:

dag图中 exchange含义 SPARK_权重_02


请问,做成一顿美味的饭至少需要多长时间:显然,我们不能用AOE图中最短时间的和作为答案,比如从开始---->熬粥----->一顿美餐,虽然只有23分钟,但是在此时菜还没有买回来呢。而买菜--->开始被菜--->开始炒菜-->一顿美餐完成 这条路线显然才是我们能把饭菜吃到嘴里的最短时间。而经过这个步骤的路径就是关键路径,关键路径经过的各个边(活动),就是关键活动。

从上述可以看出,关键路径是耗费时间最长的那条路径。

PS:个人理解,AOE网其实就是人为设计的一个网络,突出了边的意义,完全可以用带权的顶点表示也一样,这时候,开始顶点和结束顶点的权重为0。中间的顶点代表事件和耗费的时间,边仅仅表示先后次序。

AOE网通常用于工程项目的进度管理.

AOE网的结构在DAG和AOV的基础上更进一步( 要求更严格),除了有向无环的特征外,它还要求图中必须只能有一个入度为0(开始点)和出度为0(结束点)的点.