拓扑排序

拓扑排序

 

让编程改变世界

Change the world by program


 

拓扑排序(Topological)

  一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。 所有的工程或者某种流程都可以分为若干个小的工程或者阶段,称这些小的工程或阶段为“活动”。 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Active On Vertex Network)。   AOV网中的弧表示活动之间存在的某种制约关系,我们看下这个例子:我想拍一部色情电影 比如拍电影我们要先构思好灵感,然后编写剧本,寻找制片人,再选拍摄地点,找角色然后才能进行拍摄。显然我们不能在电影开拍后再重新编写剧本,寻找制片人。 AOV网同样,就是AOV网不能存在回路。  

拓扑序列含义:

设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列V1,V2,……,Vn满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前。则我们称这样的顶点序列为一个拓扑序列。
 

拓扑排序:

所谓的拓扑排序,其实就是对一个有向图构造拓扑序列的过程。
  为了说清楚刚才几个概念,我们不妨从另外一个例子出发: 计算机专业的学生必须完成一系列规定的专业基础课和专业课才能毕业,这个过程就可以被看成是一个大的工程,而活动就是学习每一门课程。我们不妨把这些课程的名称与相应的代号列于表 [caption id="attachment_2661" align="alignnone" width="600"]拓扑排序实例 拓扑排序实例[/caption]   那么这个表转换为AOV网是这样子: [caption id="attachment_2662" align="alignnone" width="600"]拓扑排序实例 拓扑排序实例[/caption] 拓扑序列(其中一种):1,13,4,8,14,15,5,2,3,10,11,12,7,6,9  

拓扑排序算法(TopologicalSort)

 

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

 
  1. 从AOV网中选择一个没有前趋的顶点(该顶点的入度为0)并且输出它;
  2. 从网中删去该顶点,并且删去从该顶点发出的全部有向边;
  3. 重复上述两步,直到剩余网中不再存在没有前趋的顶点为止。
  由刚才我们那幅AOV网图,我们可以用邻接表(因为需要删除顶点,所以我们选择邻接表会更加方便)数据结构表示: [caption id="attachment_2663" align="alignnone" width="600"]拓扑排序算法 拓扑排序算法[/caption]   代码讲解:TopologicalSort.c  

算法时间复杂度:

 
  • 对一个具有n个顶点,e条边的网来说,初始建立入度为零的顶点栈,要检查所有顶点一次,执行时间为O(n)。
  • 排序中,若AOV网无回路,则每个顶点入、出栈各一次,每个表结点被检查一次,因而执行时间是 O(n+e)。
  • 所以,整个算法的时间复杂度是 O(n+e)。
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwI8lAA3YMNR71b']视频下载[/Downlink]
原文地址:https://www.cnblogs.com/LoveFishC/p/3846342.html