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.

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

  1. 拓扑排序 Topological Sort

    2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...

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

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  3. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  4. 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort

    概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...

  5. 拓扑排序 (Topological Sorting)

    拓扑排序(Topological Sorting) 一.拓扑排序 含义 构造AOV网络全部顶点的拓扑有序序列的运算称为拓扑排序(Topological Sorting). 在图论中,拓扑排序(Topo ...

  6. [MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序

    一.深度优先搜索 它的定义是:递归探索图,必要时要回溯,同时避免重复. 关于深度优先搜索的伪代码如下: 左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点 ...

  7. 拓扑排序(Toposort)

    摘自:https://blog.csdn.net/qq_35644234/article/details/60578189 <图论算法> 1.拓扑排序的介绍 对一个有向无环图(Direct ...

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

    题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量 ...

  9. BFS (1)算法模板 看是否需要分层 (2)拓扑排序——检测编译时的循环依赖 制定有依赖关系的任务的执行顺序 djkstra无非是将bfs模板中的deque修改为heapq

    BFS模板,记住这5个: (1)针对树的BFS 1.1 无需分层遍历 from collections import deque def levelOrderTree(root): if not ro ...

  10. 拓扑排序(三)之 Java详解

    前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...

随机推荐

  1. 【转】Java学习---垃圾回收算法与 JVM 垃圾回收器综述

    [原文]https://www.toutiao.com/i6593931841462338062/ 垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的 ...

  2. 【C语言】 使用Beep() 函数 演奏歌曲

    #include <windows.h> int main(){ ){ Beep(, ); Beep(, ); Beep(, ); Beep(, ); Beep(, ); Beep(, ) ...

  3. qt designer启动后不显示界面问题的原因与解决办法

    Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面,但任务管理器中可以看到该进程是存在的.前几天还正常的,但昨天加了一块NVIDIA的显卡(机器自带核显) ...

  4. [BZOJ 1135][POI2009]Lyz

    [BZOJ 1135][POI2009]Lyz 题意 初始时滑冰俱乐部有 \(1\) 到 \(n\) 号的溜冰鞋各 \(k\) 双.已知 \(x\) 号脚的人可以穿 \(x\) 到 \(x+d\) 的 ...

  5. Programming Assignment 3: Pattern Recognition

    编程作业三 作业链接:Pattern Recognition & Checklist 我的代码:BruteCollinearPoints.java & FastCollinearPoi ...

  6. 洛谷P1803

    #include <iostream>#include <algorithm>#include <cstdio>using namespace std; struc ...

  7. [C++] set与multiset的常用函数

    参考资料:[C++ STL]Set和Multiset set 与 multiset set不允许重复 multiset允许重复 例: set : 1 2 3 4 5 6 multiset : 1 2 ...

  8. 加强对HEAD 请求的处理(转贴)

    最近发现有些搜索引擎爬虫在抓取数据的时候,先是通过一个HEAD 请求获取response的header 信息,然后再通过GET 请求获取response 的body信息(即页面的内容)——先发送HEA ...

  9. CentOS7创建本地YUM源的三种方法

    这篇文章主要介绍了CentOS7创建本地YUM源的三种方法,本文讲解了使用CentOS光盘作为本地yum源.如何为CentOS创建公共镜像.创建完全自定义的本地源等内容,需要的朋友可以参考下     ...

  10. DataGridView如何绑定DataRow对象集合

    DataGridView对象是我们在进行Winform程序开发中经常使用的呈现数据的控件,而数据则是通过DataSource这个Property来设置的.根据MSDN的说明,DataGridView对 ...