algorithm - 为什么 DFS 而不是 BFS 用于在图中查找循环

标签 algorithm tree graph-theory depth-first-search breadth-first-search

DFS 主要用于查找图中的循环而不是 BFS。有什么原因吗?两者都可以找到一个节点是否已经被 在遍历树/图时访问了。

最佳答案

深度优先搜索比广度优先搜索更节省内存,因为您可以更快地回溯。如果使用调用堆栈,实现起来也更容易,但这依赖于最长路径不会溢出堆栈。

此外,如果您的图表是 directed那么你不仅要记住你是否访问过一个节点,还要记住你是如何到达那里的。否则你可能认为你找到了一个循环,但实际上你只有两条独立的路径 A->B 但这并不意味着存在路径 B->A。 例如,

如果你从 0 开始进行 BFS,它会检测到循环存在,但实际上没有循环。

通过深度优先搜索,您可以在下降时将节点标记为已访问,并在回溯时取消标记。请参阅有关此算法性能改进的评论。

对于best algorithm for detecting cycles in a directed graph你可以看看Tarjan's algorithm .

关于algorithm - 为什么 DFS 而不是 BFS 用于在图中查找循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869647/

相关文章:

algorithm - 我如何错误地实现此算法以对螺旋中的点列表进行排序?

algorithm - 二维随机点上的值插值

algorithm - 在二叉树中找到最不常见的 parent ?

algorithm - 将图划分为两个簇

c++ - 类似的字符串算法

java - 用曼哈顿距离模式填充二维数组

java - 使用 EL 访问继承的属性/方法时出错

python - 对多维索引(任意维度)的列表表示的高效迭代

python - 如何在 GraphViz 中生成矩形样式的边而不是曲线?

algorithm - 什么是像样的初学者图形拼图?