【数据结构与算法】【算法思想】拓扑排序

本文介绍了拓扑排序的概念及其在解决依赖关系问题中的应用,如穿衣顺序、课程学习序列等。详细阐述了Kahn算法和DFS深度优先搜索算法的实现过程,包括时间、空间复杂度分析,并探讨了这两种算法在有向边反向情况下的适应性。同时,文章提出了BFS广度优先搜索算法不适合用于拓扑排序的问题。
摘要由CSDN通过智能技术生成
一、拓扑排序

拓扑排序是基于依赖关系的节点,根据依赖关系而生成的序列。节点和依赖关系往往要生成有向无环图。类似的问题有:穿衣服裤子的先后关系,生成穿衣序列/专业课程与前置课程形成的课程学习序列/代码编译依赖关系形成的编译顺序序列。

public class Graph {
   
  private int v; // 顶点的个数
  private LinkedList<Integer> adj[]; // 邻接表

  public Graph(int v) {
   
    this.v = v;
    adj = new LinkedList[v];
    for (int i=0; i<v; ++i) {
   
      adj[i] = new LinkedList<>();
    }
  }

  public void addEdge(int s, int t) {
    // s先于t,边s->t
    adj[s].add(t);
  }
}

二、实现
0x00Kahn 算法

根据邻接表,很容易计算出每个节点的入度。
遍历每个入度,将入度为0的节点,放入队列。
队列不空,循环:
取出队首元素,输出他,然后遍历他的邻接节点,将邻接节点入度-1,如果邻接节点恰好为0,将节点放入队列。
时间复杂度:求入度:O(v+e),循环输出O(v+e)合起来O(v+e)
空间复杂度:入度数组O(v),队列<O(v)


public void topoSortByKahn() {
   
  int[] inDegree = new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值