拓扑排序(Topological Sort)

Graph

拓扑排序(Topological Sort)

假设一个应用场景:你用 C 编写了一个爬虫工具,其中有很多自定义的库:queue.cqueue.hstack.cstack.hheap.cheap.h 等等,且这些文件没有其他自定义库的依赖;另外还有一些基于上述自定义库的库:bfs.cbfs.hdfs.cdfs.hdijkstra.cdijkstra.htcpSocket.ctcpSocket.h 等等;基于以上的库,你开发了一些爬虫程序 scrawlYoutube.cscrawlYoutube.hscrawlTwitter.cscrawlTwitter.h,入口为 scrawler.c
现在你需要写个 Makefile 将这些代码按照一定的依赖顺序依次编译:最先编译没有依赖项的部分,然后逐级根据之前编译好的依赖项编译基于以上依赖项的部分,直到整个系统完成编译。这个顺序就是拓扑顺序(Topological Ordering)

将上述场景中的依赖关系转化成有向无环图(Directed Acyclic Graph),就可以进行拓扑排序了。

排序算法描述:

topologicalSort(DAG)
    Input: DAG
    Output: topological ordered sequence
    allocate a buffer with size of DAG.nV
    while DAG has vertices do
        pickup a vertex from the DAG without any predecessors
        save the vertex into buffer
        remove the vertex along with all associated edges in the DAG
    return buffer

按照拓扑排序算法对上面的图排序结果就可以是:
linkedList, queue, stack, heap, directedGraph, bfs, dfs, dijkstra, tcpSocket, scrawlTwitter, scrawlYoutube, srawlMaps, scrawler
根据这个顺序和每个节点的依赖,就可以写 Makefile 编译整个系统了~

注意:

  1. 有向图必须无环(Acyclic)才能保证能够进行拓扑排序;
  2. 一个无环有向图至少(不止)有一个拓扑序列。


Written with StackEdit.

原文地址:https://www.cnblogs.com/LexLuc/p/10462563.html

时间: 2024-08-07 11:49:35

拓扑排序(Topological Sort)的相关文章

LeetCode编程训练 - 拓扑排序(Topological Sort)

拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序(被依赖的排在前面),或给出排序结果. 最常用解决拓扑排序问题的方法是Kahn算法,步骤可以概括为: 1. 根据依赖关系,构建邻接矩阵或邻接表.入度数组 2. 取入度为0的数据(即不依赖其他数据的数据),根据邻接矩阵/邻接表依次减小依赖其的数据的入度 3. 判断减小后是否有新的入度为0的数据,继续进

有向图算法之拓扑排序

拓扑排序的意思: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的

[知识点]拓扑排序

// 此博文为迁移而来,写于2015年2月24日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vspe.html 1.前言 在了解拓扑排序之前,我们先来看一道题目以更好的理解: 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前序子工程的结束为先决条件的,但有些子工程没有先决

拓扑排序算法原理以及完整的C代码实现

拓扑排序定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列.简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序. 基础知识 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个

白书 - 拓扑排序 及 关于递归、coding的一些思考

题目:有n个变量,m个二元组(u,v),表示变量u小于变量v.将所有变量从小到大排列,给出满足条件的一个. 思路:把"小于"关系看成有向边,得到一个有向图.任务就是把一个图的所有结点排序,使得每一条有向边(u,v)对应的 u 都排在 v 的前面.在图论中,这个问题称为拓扑排序topological sort.  不难发现:如果图中存在有向环,则不存在拓扑排序的解,反之则存在.我们把不包含有向环的有向图称为有向无环图(Directed Acyclic Graph,DAG). 以下是补充了

图论-拓扑排序

拓扑排序(Topological sort) 拓扑排序是对有向无环图(DAG)顶点的一种排序,它使得如果存在u, v的有向路径,那么满足序中u在v前.拓扑排序就是由一种偏序(partical order)得到的一个全序(称为拓扑有序).偏序满足自反性,反对称性,传递性的序. 拓扑排序的思路很简单,就是每次任意找一个入度为0的点输出,并把这个点以及与这个点相关的边删除,实际算法中,用一个队列实现. 算法: 1.把所有入度为0的点入队Q; 2.若队Q非空,则点u出队,输出u,否则转4; 3.把所有与

[LeetCode] 207. 课程表(拓扑排序,BFS)

题目 现在你总共有 n 门课需要选,记为?0?到?n-1. 在选修某些课程之前需要一些先修课程.?例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1: 输入: 2, [[1,0]] 输出: true 解释:?总共有 2 门课程.学习课程 1 之前,你需要完成课程 0.所以这是可能的. 示例 2: 输入: 2, [[1,0],[0,1]] 输出: false 解释:?总共有 2 门课程

简单易懂的拓扑排序

1.定义 对一个有向无环图(Directed Acyclic Graph简称DAG) G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列.简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序. 在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前

拓扑排序的简单证明以及由来

介绍 拓扑排序,很多人都可能听说但是不了解的一种算法.或许很多人只知道它是图论的一种排序,至于干什么的不清楚.又或许很多人可能还会认为它是一种啥排序.而实质上它是对有向图的顶点排成一个线性序列. 至于定义,百科上是这么说的: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological O

拓扑排序详解

拓扑排序看起来很难,其实了解后不算难(思想非常清楚) 关键掌握思想后需要学会应用到具体的题目中去.(从入度为0到出度为0) 1.拓扑排序的介绍 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.     拓扑排序对应施工的流程图具有特别重要的作用,它可以决定哪些子工程必须要先执行,哪些子工程要在某些工程执行后才可以执行.为了形象地反映出整个