拓扑排序

来源:互联网 发布:2016安卓版录音软件 编辑:程序博客网 时间:2024/05/16 18:29

拓扑排序是指由某个集合上的偏序关系得到该集合上的全序关系。

若集合X上的关系R是自反的、反对称的和传递的,则称关系R是集合X上的偏序关系(半序关系)。

偏序关系和前面在树中讲过的等价类非常相似。集合X上的偏序关系R说明(设关系R为定义在集合X上的二元关系):

(1)若对每一个x∈X,都有(x,x)∈R,则称R是自反的。

(2)若对任意的x,y,z∈X,当(x,y)∈R且(y,x)∈R时,有(x,z)∈R,则称关系R是传递的。

(3)若对所有的x,y∈X,当(x,y)∈R且(y,x)∈R时,有x=y,则称关系R是反对称的。相等关系就是反对称关系。

若对所有的x,y∈X,有(x,y)∈R或(y,x)∈R,则称关系R时集合X上的全序关系。

偏序关系的实质是在集合X的元素之间建立层次关系,当不能保证任意两个元素之间都能进行比较,而全序关系可以保证。

有向图在实际问题中的应用:

一个有向图可以表示一个施工流程图、产品生产流程图、数据流图等,我们以有向图中的顶点来表示活动,以有向边来表示活动之间的先后顺序,则这样的有向图称为“顶点表示活动的网”即AOV网。如何得到一个完成整个项目的各个子工程的序列,就是有向图的拓扑排序问题。

拓扑排序:

对AOV网的拓扑排序就是将AOV网中的所有顶点排成一个线性序列。拓扑排序实际上就是要由某个集合上的一个偏序关系得到该集合上的一个全序关系。

用下图再次说明偏序关系和全序关系,如左图偏序关系,当写出顶点线性序列时不知道B和C谁在前谁在后,所以,我们人工添加一条有向边B→C,就构成右图全序关系。


拓扑排序算法:

(1)在有向图中选择一个没有前驱的顶点,并把它输出;

(2)从有向图中删去该顶点以及与它相关的有向边。

重复以上两步,直到所有顶点都输出,那么输出的顶点序列就是一个拓扑序列;

或者剩余的顶点中找不到没有前驱的顶点为止,说明图中存在回路,一定无法得到一个拓扑序列。

以上算法只能得到一个拓扑序列,若要得到所有的拓扑序列还需改进算法。

对于下图AOV网,利用上述算法得到的一个拓扑序列为:0,1,7,2,4,8,5,9,3,6。


算法实现讨论:

通常,为了避免每次都重复查找入度为0的顶点,拓扑排序算法可利用一个堆栈或队列来暂时存放当前入度为0的所有顶点。在实现有n个顶点的拓扑排序算法时,用一个有n个元素的数组存放每个顶点的入度,若要删除和某个入度为0顶点相关的有向边,可把该顶点的各个邻接顶点的入度减1来实现。

逆拓扑序列:

若已知一个有向图初始只有一个入度为0的顶点,并且该图无环,则可以修改图的深度优先算法为:每当退出深度优先遍历算法时才输出当前顶点,则输出的顶点一定是出度为0的顶点,从而得到该图的一种逆拓扑序列。(个人理解:其实就是先由源点深度遍历到最后一个结点,再一边回溯,一边输出)。

对于上图,由修改的深度优先遍历算法得到的逆拓扑序列为:3,2,6,5,9,4,1,8,7,0

0 0