繁体   English   中英

什么时候在 bfs 或 dfs 中添加要访问的节点?

[英]When do you add a node to visited in bfs or dfs?

嘿,我一直在研究 BFS/DFS,我注意到它们中的许多都有轻微的修改,那就是当一个节点被添加到访问集时。

在一种方式中,该算法将从堆栈/队列中弹出节点,然后将其添加到访问集。 然后它将添加所有未访问过的邻居

在另一个实现中,该节点不被添加到那里的访问集中。 相反,它会将所有尚未访问的邻居添加到堆栈/队列中,但它会在将这些邻居添加到访问集时将其添加到堆栈/队列中。

总而言之,在一种方法中,当它们被弹出到堆栈/队列中时,它们被添加到访问集中。 在另一种方法中,当它们被添加到堆栈/队列时,它们被添加到访问集。

我的两个问题是:两者有什么区别? 我应该使用哪一个?

如果我只在它被弹出并且图中有循环时将它添加到访问中,我可以看到一些问题发生了,但我也不是 100% 确定这一点。 任何帮助将不胜感激。

两者都具有相同的算法复杂性和正确性。

但是,仅在开始遍历邻居之前标记访问过的顶点会稍微慢一些。 在 BFS 的情况下,这意味着将相同的顶点多次冗余地添加到队列中。 在 DFS 的情况下,这意味着在同一顶点上多次冗余调用 dfs function。

因此,我个人总是喜欢在将顶点添加到堆栈/队列之前将其标记为已访问。

暂无
暂无

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

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