【发布时间】:2018-11-16 10:25:20
【问题描述】:
在阅读了DFS 打印输出的示例后,我有点困惑 两种 DFS 方法都以不同的方式进行,尽管两者都被称为 DFS。
事实上,DFS 递归方法打印输出的方式与 BFS。那么有什么区别呢?这里给出的递归方法不是 DFS 的例子吗?
使用堆栈
// Iterative DFS using stack
public void dfsUsingStack(Node node)
{
Stack<Node> stack=new Stack<Node>();
stack.add(node);
node.visited=true;
while (!stack.isEmpty())
{
Node element=stack.pop();
System.out.print(element.data + " ");
List<Node> neighbours=element.getNeighbours();
for (int i = 0; i < neighbours.size(); i++) {
Node n=neighbours.get(i);
if(n!=null && !n.visited)
{
stack.add(n);
n.visited=true;
}
}
}
}
输出是 40,20,50,70,60,30,10
递归方法
// Recursive DFS
public void dfs(Node node)
{
System.out.print(node.data + " ");
List neighbours=node.getNeighbours();
node.visited=true;
for (int i = 0; i < neighbours.size(); i++) {
Node n=neighbours.get(i);
if(n!=null && !n.visited)
{
dfs(n);
}
}
}
输出是 40,10,20,30,60,50,70 与BFS下的输出相同
那么有什么区别呢?
【问题讨论】:
-
您可能希望将您正在遍历的图表作为该问题的一部分。否则,访问过的节点列表毫无意义。
-
在某些图中,DFS 和 BFS 会产生相同的遍历顺序。没有错。你在遍历什么图?
-
补充@AnT 的答案:由于邻居/边添加到图中的顺序,BFS 和反向 DFS(或伪 DFS,如 AnT 所称)也只是巧合它)同时遍历相同的节点。如果你的 BFS 实现中邻居的访问顺序颠倒了,你会得到不同的结果。
-
你在编造一些东西。您的图片不正确,或者您的第二个输出不正确,或者其他内容不正确。如果第二个实现决定以
40, 10, ...开始,那么它总是必须转到30下一个:40, 10, 30...。然而,您声称您的第二个实现以某种方式产生了40,10,20,30,60,50,70。这是不可能的。我怀疑边缘10-30并不真正存在于您的实际数据中。 -
@AnT 我已经给出了图片来源和输出基于相同程序的链接
标签: algorithm graph-theory depth-first-search breadth-first-search