算法:拓扑排序

算法:拓扑排序

拓扑排序

什么是拓扑排序

  其实在写这篇博客的时候,我也是以一个学习者的角度出发的,目的就是想让自己理解和初步掌握拓扑排序。

  维基百科的定义如下:  

    在计算机科学领域,有向图顶点的线性排序就是其拓扑排序例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个任务之前执行的约束; 在这个应用中,拓扑排序只是一个有效的任务顺序。当且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的。 任何 DAG 具有至少一个拓扑排序,并且已知这些算法用于在线性时间内构建任何 DAG 的拓扑排序。

  在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序英语:Topological sorting)。

  1. 每个顶点出现且只出现一次
  2. 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面

  比如在下图中,当然首先必须是有向无环图,从1出发到达,拓扑序列可以为1,3,2,5,4。

  

我们在写有向无环图的拓扑排序时遵循一种常用的方法:

  1. 从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。
  2. 从图中删除该顶点和所有以它为起点的有向边。
  3. 重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。

拓扑排序的应用

  拓扑排序通常用来“排序”具有依赖关系的任务

  比如,如果用一个DAG图来表示一个工程,其中每个顶点表示工程中的一个任务,用有向边 表示在做任务 B 之前必须先完成任务 A。故在这个工程中,任意两个任务要么具有确定的先后关系,要么是没有关系,绝对不存在互相矛盾的关系(即环路)。

  

拓扑排序的实现

算法图解

 

 

 

  

  

猜你喜欢

转载自www.cnblogs.com/MrSaver/p/9994720.html