拓扑排序算法分析(通俗易懂)

拓扑排序(其实是一种依赖关系):对于有向且无环的图来说,当前这个节点的依赖来其之前已经完成了。

下面附上一个图让大伙更好的理解:


比如这个图:B需要依赖A才能完成,A需要依赖C和D才能完成,而D需要依赖F才能完成,画出图就如上所示:

而最终的拓扑排序序列则为:FDCAB(不难发现,入度最小的先遍历)


基本思想:

1. 先把入度为0 的节点找到并打印

2. 删掉入度为0的节点,继续循环1的步骤,直至图为null。


基本思想是很简单的,下面是程序实现流程:

1. 定义一个队列和一个HashMap(HashMap用来存储Node节点和该节点入度的值);

2. 遍历所有的节点,把所有的节点的入度和node值存放到HashMap中去,并将入度为0的节点存放到队列queue中去;

3.定义一个List数组,用来存放Node,并作为最后的节点输出 ;

4. 取出队列中的一个元素,并将该元素添加到result数组中 ;

5. 遍历上面取出的元素的next节点,将其所有next节点的入度都-1 如果有一些节点的入度变为0时,把他们放进去队列queue里面; 而如果上面取出的元素没有next的话,继续从队列queue中poll()出新的元素

(建议大家按照程序一起看,容易理解一些)下面附上程序源码:


喜欢的记得点个赞哦~

  • 29
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
拓扑排序是用于有向无环图(DAG, Directed Acyclic Graph)中节点排序的一种算法,它确保了所有依赖关系都得到满足后,每个节点才会被访问。算法的主要目的是确定一个线性的序列,其中的每一个节点都在其所有前驱节点之后。 拓扑排序的基本算法复杂度分析如下: 1. 时间复杂度(Time Complexity): - 最优情况(Best Case):如果输入图已经是线性的,即没有环,拓扑排序可以在一次遍历中完成,时间复杂度为 O(V+E),其中 V 是顶点数,E 是边数。这是因为每次迭代都可以确定一个节点的位置,不需要回溯。 - 平均情况(Average Case):在一般的有向无环图中,算法的时间复杂度仍然是线性的,因为仍然是一次遍历,但可能无法确定是否为最优情况。 - 最坏情况(Worst Case):最坏情况发生在存在环,但环的节点恰好构成一个回路,这时算法需要进行多次迭代才能确定正确的顺序,导致复杂度退化到 O(VE),因为每增加一个节点,最多需要遍历整个图。 2. 空间复杂度(Space Complexity): - 常数空间:基本的拓扑排序算法使用常数额外空间来存储前驱节点集合,因此空间复杂度为 O(1)。 - 较大空间:如果采用深度优先搜索(DFS)或递归方法,可能会需要一个栈来保存递归调用,此时空间复杂度为 O(V)(最大递归深度等于V,最坏情况下),但这通常不是标准的拓扑排序算法的首选实现。 需要注意的是,拓扑排序不是所有的图都有解,对于有环的有向图,它会返回“无解”,这就涉及到了算法的正确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值