Ada*_*Max 5 search graph-theory graph breadth-first-search depth-first-search
嘿,我一直在研究 BFS/DFS,我注意到它们中的许多都有轻微的修改,那就是当一个节点被添加到访问集中时。
在一种方式中,算法将从堆栈/队列中弹出节点,然后将其添加到访问集中。然后它将添加所有尚未访问过的邻居
在另一个实现中,节点不被添加到那里的访问集中。相反,它会将所有尚未访问过的邻居添加到堆栈/队列中,但在将这些邻居添加到堆栈/队列中时,它会将这些邻居添加到访问集中。
总而言之,在一种方法中,当它们弹出到堆栈/队列时,它们被添加到访问集中。在另一种方法中,当它们被添加到堆栈/队列时,它们被添加到访问集中。
我的两个问题是:两者有什么区别?我应该使用哪一个?
如果我只在弹出它时将其添加到访问中并且图中存在循环,我可以看到会发生一些问题,但我也不能 100% 确定这一点。任何帮助将不胜感激。
两者具有相同的算法复杂性和正确性。
然而,仅在开始遍历邻居之前标记已访问的顶点会稍微慢一些。对于 BFS,这意味着将同一个顶点多次冗余地添加到队列中。对于DFS,这意味着在同一顶点上多次冗余地调用dfs函数。
因此,我个人总是喜欢在将顶点添加到堆栈/队列之前将其标记为已访问。