微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

卡恩算法与 DFS 的课程安排 leetcode

如何解决卡恩算法与 DFS 的课程安排 leetcode

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

这个问题涉及检测一个循环,如果有,则您无法完成所有课程。

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

那么..是哪个? DFS 更适合检测循环还是 BFS?

解决方法

两者的时间复杂度均为 O(V+E),空间复杂度均为 O(V+E)。所以在这些方面没有赢家。

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

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

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

,

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

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

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

因此,如果您要明确检查 DAG 以查看它是否具有循环,通常可汗算法是最好的。如果您出于某种其他原因已经在进行 DFS,并且您希望在此过程中检测循环,则 DFS 技术非常有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。