代码之家  ›  专栏  ›  技术社区  ›  user3198603

在这个例子中DFS和BFS之间的区别是什么?

  •  0
  • user3198603  · 技术社区  · 6 年前

    在读了一些例子之后,我有点困惑 DFS 尽管这两种方法都被称为DFS,但它们的方式不同。

    BFS . 那有什么区别?这里给出的递归方法不是DFS的例子吗?

    enter image description here

    使用堆栈

    // 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公司

    2 回复  |  直到 6 年前
        1
  •  3
  •   c0der    6 年前

    虽然最终结果(路径)可能是相同的,但bfs和dfs(不是发布的特定实现)之间的根本区别在于搜索机制。
    一个明显的例子是只有一条路径存在的情况。在这种情况下,任何好的搜索算法(无论是dfs、bfs还是其他)最终都会找到一条路径。
    如果存在多个路径,bfs和dfs可能会找到相同的路径或不同的路径。bfs的一个特点是能找到最短路径。
    搜索机制的核心区别在于,bfs在所有方向上(因此称为广度)都进行了同等的探索,而dfs在一个(通常是随机的)方向上(因此称为深度)进行探索,如果找不到解决方案,则进行“回溯”。
    this 一个。

    enter image description here

    通过观察代表探测节点的灰点,可以看到bfs的性质,它类似于洪水。

    enter image description here

        2
  •  2
  •   AnT stands with Russia    6 年前

    第一种方法根本不是DFS,至少在DFS算法的规范定义中是这样。它只是BFS,其中有人用堆栈替换队列。然而,这种实现足以“模拟”DFS,从某种意义上说,它可以按类似DFS的顺序发现图顶点。它可以被称为“伪DFS”,如果你愿意的话,因为DFS类似于发现顺序,但是规范的DFS算法远不止这些。

    回溯 顺序(即 "gray" vertex becomes "black" vertex

    同时,第二种方法是经典DFS算法的显式递归实现。

    在任何情况下,无论是真df还是伪df,都不存在访问顶点的“一个真实顺序”。两种实现都可以产生相同的顶点访问顺序。在你的情况下,没有人会费心去确保这一点。输出的差异是由前一个实现访问中的邻居这一简单事实造成的 颠倒 顺序-从最后到第一。所有的邻居首先被推到一个堆栈中,然后一个接一个地弹出以供访问。堆栈的后进先出行为是产生反转的原因。同时,后一种实现方式是访问他们家乡的邻居 向前地 顺序-从头到尾。

    如果将后一个实现中的循环替换为

    for (int i = neighbours.size() - 1; i >= 0; --i) 
    

    在两个实现中,您应该得到相同的访问顺序(相同的输出)。