浅谈什么是图拓扑排序1 引言 在工程实践中,一个工程项目往往由若干个子项目组成。这些子项目间往往有两种关系: 例如:在工厂里产品的生产线上,一个产品由若干个零部件组成。零部件生产时,也存在这两种关系: 2 重要概念 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环。常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度。 3 拓扑排序 拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 4 入度表法入度表法是根据顶点的入度来判断是否存在依赖关系。若顶点入度不为0。则必然此顶点的事件有前驱依赖事件,因此每次选取入度为0的顶点输出,则符合拓扑排序的性质。 4.1 算法流程(1)从图中选择一个入度为0的顶点,输出该顶点。 4.2 实例图解例如:图4.2.1所示的有向无环图,采用入度表的方法获取拓扑排序过程。 (1)选择图中入度为0的顶点1,输出顶点1。删除顶点1,并删除以顶点1为尾的边。删除后图为: (2)继续选择入度为0的顶点。现在,图中入度为0的顶点有2和4,这里我们选择顶点2,输出顶点2。删除顶点2,并删除以顶点2为尾的边。删除后图为: (3)选择入度为0的顶点4,输出顶点4.删除顶点4,并删除以顶点4为尾的边。删除后图为: (4)选择入度为0的顶点3,输出顶点3.删除顶点3,并删除以顶点3为尾的边。删除后图为: (5)最后剩余顶点5,输出顶点5,拓扑排序过程结束。最终的输出结果为: 4.3 性能分析算法时间复杂度分析:统计所有节点入度的时间复杂性为(VE);接下来删边花费的时间也是(VE),总花费时间为O(VE)。若使用队列保存入度为0的顶点,则可以将这个算法复杂度将为O(V+E)。 5 DFS方法深度优先搜索过程中,当到达出度为0的顶点时,需要进行回退。在执行回退时记录出度为0的顶点,将其入栈。则最终出栈顺序的逆序即为拓扑排序序列。 5.1 算法流程(1)对图执行深度优先搜索。 5.2 实例图解例如图5.2.1所示的有向无环图,采用DFS的方法获取拓扑排序过程。 (1)选择起点为顶点1,,开始执行深度优先搜索。顺序为1->2->3->5。 (2)深度优先搜索到达顶点5时,顶点5出度为0。将顶点5入栈。 (3)深度优先搜索执行回退,回退至顶点3。此时顶点3的出度为0,将顶点3入栈。 (4)回退至顶点2,顶点2出度为0,顶点2入栈。 (5)回退至顶点1,顶点1可以前进位置为顶点4,顺序为1->4。 (6)顶点4出度为0,顶点4入栈。 (7)回退至顶点1,顶点1出度为0,顶点1入栈。 (8)栈的逆序为1->4->2->3->5。此顺序为拓扑排序结果。 5.3 性能分析时间复杂度分析:首先深度优先搜索的时间复杂度为O(V+E),而每次只需将完成访问的顶点存入数组中,需要O(1),因而总复杂度为O(V+E)。 推荐阅读 |
朋友会在“发现-看一看”看到你“在看”的内容