Kahn 算法与 DFS 的课程安排 leetcode

问题描述 投票:0回答:2

leetcode课程表:https://leetcode.com/problems/course-schedule/

这个问题涉及到检测一个循环,如果有一个循环,那么你就无法完成所有课程。

我听说DFS最推荐用于检测周期,但Kahn算法更推荐用于课程安排问题,这是一种BFS解决方案。

所以..是哪一个? DFS 更适合检测周期还是 BFS 更好?

algorithm data-structures graph depth-first-search breadth-first-search
2个回答
5
投票

两者的时间复杂度都是 O(V+E),空间复杂度都是 O(V+E)。因此,从这些角度来看,没有赢家。

一个使用队列,另一个使用堆栈。一个使用每个节点的度数,另一个使用每个节点的访问标记。

一个区别是 DFS 可以通过递归使用隐式堆栈,这可能会使代码更加紧凑。但话又说回来,您会受到可用调用堆栈空间的限制,因此对于大输入来说,使用递归可能不是一个可行的解决方案,并且使用显式堆栈最终可能是基于 DFS 的解决方案的选择。

所以总而言之,它们是平等的。选择其中之一。


1
投票

在实际工作中,使用 O(N) 堆栈空间总是一个坏主意,因此实用的基于 DFS 的解决方案将使用显式堆栈。

显式堆栈实现有点复杂,因为堆栈不仅仅是节点堆栈——您还需要存储每个打开节点在子列表中的当前位置——并且遍历逻辑变得有点复杂。

DFS 解决方案并不糟糕,但如果你想编写一个好的可靠解决方案,那么 Khan 的算法在最坏的情况下最终会变得更简单、更快。它还将使用更少的内存,因为待处理节点列表只是节点列表。 (如果您像堆栈或队列一样使用该列表并不重要。在大多数情况下,像堆栈一样使用它会更快/更容易)

因此,如果您要显式检查有向图以查看它是否有循环,通常卡恩算法是最好的。如果您已经出于其他原因进行了 DFS 并且想要检测沿途的循环,则 DFS 技术非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.