如何快速掌握拓扑排序算法:Kahn与DFS两种实现方法详解
【免费下载链接】algo 数据结构和算法必知必会的50个代码实现 项目地址: https://gitcode.com/gh_mirrors/alg/algo
拓扑排序是解决有向无环图(DAG)依赖关系问题的核心算法,在任务调度、编译顺序、课程安排等场景中有着广泛应用。本文将通过 gh_mirrors/alg/algo 项目中的代码实例,为你详细解析拓扑排序的两种经典实现方法。
🔍 什么是拓扑排序?
拓扑排序是一种对有向无环图进行线性排序的算法,使得对于图中的任意一条边(u, v),u在排序中都出现在v之前。简单来说,就是在保证依赖关系的前提下,将任务按顺序排列。
核心应用场景:
- 任务调度系统
- 软件编译依赖管理
- 课程选修顺序规划
- 工作流程编排
🚀 两种经典实现方法
Kahn算法实现
Kahn算法基于贪心思想,通过不断移除入度为0的节点来完成排序:
# python/43_topological_sorting/topological_sorting.py
def tsort_by_kahn(self) -> None:
in_degree = [0] * self._num_vertices
# 计算所有节点的入度
for v in range(self._num_vertices):
if len(self._adjacency[v]):
for neighbour in self._adjacency[v]:
in_degree[neighbour] += 1
# 将入度为0的节点加入队列
q = deque(filterfalse(lambda x: in_degree[x], range(self._num_vertices)))
while q:
v = q.popleft()
print(f"{v} -> ", end="")
for neighbour in self._adjacency[v]:
in_degree[neighbour] -= 1
if not in_degree[neighbour]:
q.append(neighbour)
算法步骤:
- 计算所有节点的入度
- 将入度为0的节点加入队列
- 从队列中取出节点并输出
- 将该节点的所有邻接节点入度减1
- 重复直到队列为空
DFS深度优先搜索实现
基于DFS的拓扑排序利用递归完成逆后序排列:
// javascript/43_topological_sorting/dsf.js
sortingByDsf: function(){
var inverseAdj = new Map();
// 构建逆邻接表
for(let key of keys) {
let blk = self.adj.get(key);
if(blk) {
for(let v of blk) {
if(!inverseAdj.get(v)) {
inverseAdj.set(v, [key]);
} else {
inverseAdj.get(v).push(key);
}
}
}
}
// 对每个未访问节点执行DFS
for(let vertex of vertexes) {
if(!visited.includes(vertex)) {
visited.push(vertex);
this.dsf(vertex, inverseAdj, visited);
}
}
📊 算法对比分析
| 特性 | Kahn算法 | DFS算法 |
|---|---|---|
| 实现复杂度 | 简单易懂 | 相对复杂 |
| 空间复杂度 | O(V+E) | O(V) |
| 时间复杂度 | O(V+E) | O(V+E) |
| 适用场景 | 实时系统 | 离线分析 |
🛠️ 实战应用示例
项目提供了完整的测试用例:
# 创建4个节点的有向图
dag = Graph(4)
dag.add_edge(1, 0)
dag.add_edge(2, 1)
dag.add_edge(1, 3)
# 分别使用两种方法排序
dag.tsort_by_kahn() # 输出: 2 -> 1 -> 0 -> 3
dag.tsort_by_dfs() # 输出: 2 -> 1 -> 3 -> 0
💡 学习建议
- 理解基础概念:先掌握有向图、入度、邻接表等基本概念
- 动手实践:克隆项目并运行示例代码
- 举一反三:尝试在项目中找到其他语言的实现版本
📁 项目资源
- Python实现:python/43_topological_sorting/topological_sorting.py
- JavaScript实现:javascript/43_topological_sorting/dsf.js
- 完整项目:
git clone https://gitcode.com/gh_mirrors/alg/algo
拓扑排序作为图论中的重要算法,不仅在实际项目中应用广泛,也是面试中的高频考点。通过 gh_mirrors/alg/algo 项目中的实现,你可以快速掌握这一算法的精髓。
🚀 立即行动:现在就去项目中找到更多语言的实现,比较不同编程语言下的实现差异,加深对算法的理解!
【免费下载链接】algo 数据结构和算法必知必会的50个代码实现 项目地址: https://gitcode.com/gh_mirrors/alg/algo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



