[英]Dfs Vs Bfs confusion
从topcoder文章 :
“在BFS中,当我们将顶点推入队列时,我们将其标记为已访问,而不是在DFS情况下将其弹出。
注意:这是在使用显式堆栈执行dfs的情况下所说的。(伪dfs)。
我的问题是为什么呢? 为什么我们不能标记从队列弹出后访问的顶点,而是在bfs情况下将其推入队列?
您可能因为对树的考虑过多而感到困惑,但是BFS和DFS可以在任何图形上运行。 例如,考虑具有像ABCA
这样的循环的图。 如果您从A
开始广度优先,则首先将B和C
添加到列表中。 然后,将弹出B
,除非将它们标记为已访问,否则将C
和A
添加到列表中,这显然是错误的。 相反,如果您先从A
开始深入,那么您将访问B
,然后从那里前往C
,然后到达A
,除非A
已被标记为已访问。
因此,总而言之,无论采用哪种算法,都需要在第一次看到顶点时就将其标记为可见。 但是,如果仅考虑DAG,您会发现事情会变得容易一些,因为那里根本没有像上面这样的循环。 无论如何,整体意义在于您不会陷入循环之中,并且存在多种变体。 设置标记是一种方法,检查一组访问的顶点是另一种方法,在某些情况下,例如树,您无需执行任何操作,只需按顺序迭代边缘即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.