如何快速掌握拓扑排序算法:Kahn与DFS两种实现方法详解

如何快速掌握拓扑排序算法:Kahn与DFS两种实现方法详解

【免费下载链接】algo 数据结构和算法必知必会的50个代码实现 【免费下载链接】algo 项目地址: 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)

算法步骤:

  1. 计算所有节点的入度
  2. 将入度为0的节点加入队列
  3. 从队列中取出节点并输出
  4. 将该节点的所有邻接节点入度减1
  5. 重复直到队列为空

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

💡 学习建议

  1. 理解基础概念:先掌握有向图、入度、邻接表等基本概念
  2. 动手实践:克隆项目并运行示例代码
  3. 举一反三:尝试在项目中找到其他语言的实现版本

📁 项目资源

拓扑排序作为图论中的重要算法,不仅在实际项目中应用广泛,也是面试中的高频考点。通过 gh_mirrors/alg/algo 项目中的实现,你可以快速掌握这一算法的精髓。

🚀 立即行动:现在就去项目中找到更多语言的实现,比较不同编程语言下的实现差异,加深对算法的理解!

【免费下载链接】algo 数据结构和算法必知必会的50个代码实现 【免费下载链接】algo 项目地址: https://gitcode.com/gh_mirrors/alg/algo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值