
【计】 topological ordering; topological sort; topological sorting
拓扑排序(Topological Sorting)是一种对有向无环图(Directed Acyclic Graph, DAG)的顶点进行线性排序的算法,其核心要求是:对于图中的每一条有向边 ( u to v ),在排序结果中顶点 ( u ) 必须出现在顶点 ( v ) 之前。这种排序反映了顶点间的依赖关系,常用于任务调度、编译顺序确定等场景。
图的性质要求
拓扑排序仅适用于有向无环图(DAG)。若图中存在环,则无法找到满足所有边方向的线性序列。例如,若存在 ( A to B ) 和 ( B to A ) 的环,则无法确定 ( A ) 与 ( B ) 的先后顺序。
偏序到全序的转化
拓扑排序将顶点间的偏序关系(Partial Order)转化为全序关系(Total Order)。在偏序中,并非所有顶点都需直接比较;而在全序中,所有顶点需按依赖关系严格排列。
拓扑排序可通过以下两种经典方法实现:
Kahn算法(基于入度)
来源:Kahn, A.B. (1962). "Topological sorting of large networks".
基于DFS的算法
来源:Cormen, T.H. et al. (2009). "Introduction to Algorithms"(《算法导论》)。
任务调度
在项目管理中,拓扑排序可确定任务执行顺序,确保前置任务先于依赖任务完成。例如,编译系统中源文件的编译顺序需满足头文件依赖关系。
课程安排
大学课程需按先修关系排序,如学生需修完《高等数学》才能学习《数据结构》。
数据流分析
在编译器优化中,拓扑排序用于确定基本块(Basic Block)的执行顺序,以支持数据依赖分析。
中文术语 | 英文术语 |
---|---|
拓扑排序 | Topological Sorting |
有向无环图 | Directed Acyclic Graph (DAG) |
入度 | In-degree |
偏序关系 | Partial Order |
深度优先搜索 | Depth-First Search (DFS) |
拓扑排序是图论中的一种算法,专用于处理有向无环图(DAG)。它的核心目标是将图中的所有顶点排列成一个线性序列,使得对于图中的任意一条有向边 (u to v),顶点 (u) 在序列中始终位于顶点 (v) 的前面。这种排序反映了顶点之间的依赖关系。
依赖关系
拓扑排序适用于存在“先后顺序”的场景。例如:
有向无环图(DAG)
图中不能存在循环依赖,否则无法进行拓扑排序。例如,若任务A依赖任务B,同时任务B又依赖任务A,则形成环,此时无解。
初始化
统计每个顶点的入度(即指向该顶点的边数)。
选择起点
将所有入度为0的顶点加入队列(或列表),这些顶点没有前置依赖。
迭代移除
依次取出队列中的顶点:
终止条件
重复上述过程直到队列为空。若结果序列包含所有顶点,则排序成功;否则,图中存在环,无法排序。
假设有课程依赖关系:
拓扑排序结果为:A → B → C。
若存在多个入度为0的顶点(如A和D同时无依赖),则排序结果不唯一(如A → D → B → C 或 D → A → B → C)。
通过拓扑排序,可以高效解决依赖关系中的顺序问题,但需确保图中无环。
阿片黄帮浆A半载不法利润侧腹裂出力道奇颚式压碎机耳后的更新投资光电作用鼓室粘膜合理环形计算器汇兑最高限额加密网络监督任务近处聚合盐立式的泡罩塔平台乳酪状的色组商业营业税实际顺序同离子溶液痛性截瘫烷氧羰基尾部的