繁体   English   中英

DFS与BFS的混淆

[英]Dfs Vs Bfs confusion

topcoder文章

“在BFS中,当我们将顶点推入队列时,我们将其标记为已访问,而不是在DFS情况下将其弹出。

注意:这是在使用显式堆栈执行dfs的情况下所说的。(伪dfs)。

我的问题是为什么呢? 为什么我们不能标记从队列弹出后访问的顶点,而是在bfs情况下将其推入队列?

您可能因为对树的考虑过多而感到困惑,但是BFS和DFS可以在任何图形上运行。 例如,考虑具有像ABCA这样的循环的图。 如果您从A开始广度优先,则首先将B和C添加到列表中。 然后,将弹出B ,除非将它们标记为已访问,否则将CA添加到列表中,这显然是错误的。 相反,如果您先从A开始深入,那么您将访问B ,然后从那里前往C ,然后到达A ,除非A已被标记为已访问。

因此,总而言之,无论采用哪种算法,都需要在第一次看到顶点时就将其标记为可见。 但是,如果仅考虑DAG,您会发现事情会变得容易一些,因为那里根本没有像上面这样的循环。 无论如何,整体意义在于您不会陷入循环之中,并且存在多种变体。 设置标记是一种方法,检查一组访问的顶点是另一种方法,在某些情况下,例如树,您无需执行任何操作,只需按顺序迭代边缘即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM