贡献者: 待更新
(本文根据 CC-BY-SA 协议转载自原搜狗科学百科对英文维基百科的翻译)
在计算机科学中,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于每个从顶点 u 到顶点 v 的有向边,代表
拓扑排序的典型应用是根据作业或任务的相关性来安排它们的顺序。作业由顶点表示,如果作业 x 必须在作业 y 开始之前完成,则从 x 到 y 有一条边(例如,洗衣服时,洗衣机必须在我们将衣服放入烘干机之前完成)。然后,拓扑排序给出了执行作业的顺序。拓扑排序算法的一个密切相关的应用是在 20 世纪 60 年代早期被首次研究的,其背景是在项目管理中用于调度的 PERT 技术(Jarnagin 1960);在这个应用中,图的顶点代表项目的决定性事件,边代表必须在一个决定性事件和另一个之间执行的任务。拓扑排序构成了寻找项目关键路径的线性时间算法的基础,一系列决定性事件和任务控制着整个项目进度的长度。
在计算机科学中,这种类型的应用出现在指令调度、在电子表格中重新计算公式值时对公式单元格求值的排序、逻辑合成、确定在 makefiles 中执行的编译任务的顺序、数据序列化以及解决链接器中的符号依赖性等方面。它还用于决定在数据库中以何种顺序加载带有外键的表。
拓扑排序的常用算法的运行时间是节点数加上边数的线性渐进,
卡恩(1962)首先描述了其中一种算法,它通过选择与最终拓扑排序相同顺序的顶点来工作。首先,找到一个没有引入边的 “起始节点” 列表,并将它们插入到集合 S 中;非空无环图中必须至少存在一个这样的节点。然后:
如果该图是一个 DAG,一个解决方案将包含在列表 L 中(该解决方案不一定是唯一的)。否则,图必须至少有一个环,因此拓扑排序是不可能的。反映出结果排序的非唯一性,结构 S 可以是简单的集合、队列或堆栈。根据节点 n 从集合 S 中移除的顺序,会生产不同的解决方案。卡恩算法的一个变体在字典上打破了联系,这是科菲曼-格雷厄姆并行调度和分层图形绘制算法的一个关键组成部分。
拓扑排序的另一种算法是基于深度优先搜索。该算法以任意顺序遍历图中的每个节点,启动深度优先搜索,当该搜索到达自拓扑排序开始以来已经被访问过的任何节点或者该节点没有输出边(即叶节点)时终止:
只有在考虑了依赖于在并行随机存取机器上,可以使用多项式数量的处理器在 0(log2n)时间内构造拓扑排序,将问题归入复杂性类 NC2 (Cook 1985)。一种方法是用最小加矩阵乘法,用最大化代替最小化,对给定图的邻接矩阵进行多次对数平方。得到的矩阵描述了图中最长的路径距离。根据顶点最长输入路径的长度对顶点进行排序,进而构造拓扑排序(Dekel,Nassimi & Sahni 1981)。
拓扑排序也可用于通过加权有向无环图快速计算最短路径。假设 V 是这样一个图中顶点的列表,按拓扑顺序排列。然后,以下算法计算从某个源顶点
在
如果拓扑排序具有排序顺序中所有连续顶点对由边连接的性质,那么这些边在 DAG 中形成有向哈密顿路径。如果哈密顿路径存在,拓扑排序顺序是唯一的;没有其他顺序符合路径上的边。相反,如果拓扑排序不形成哈密尔顿路径,则 DAG 将具有两个或更多有效的拓扑排序,因为在这种情况下,总是有可能通过交换没有通过边彼此连接的两个连续顶点来形成第二有效排序。因此,有可能在线性时间内测试是否存在唯一的排序,以及哈密尔顿路径是否存在,尽管哈密尔顿路径问题对于更一般的有向图来说具有 NP-难度(Vernet & Markenzon 1997)。
拓扑序也与数学中偏序的线性扩展概念密切相关。在高级术语中,有向图和偏序之间有一个联系。[2]
偏序集只是一组对象以及 “
只要存在从
[1] ^Cormen, Thomas H.(英语:Thomas H. Cormen); Leiserson, Charles E. ; Rivest, Ronald L.; Stein, Clifford (2009) [1990]. Introduction to Algorithms (3rd ed.). MIT Press and McGraw-Hill. pp. 655–657. ISBN 0-262-03384-4.CS1 maint: Multiple names: authors list (link).
[2] ^Spivak, David I. (2014). Category Theory for the Sciences. MIT Press..