【问题标题】:recursive implementation of Depth first search to find path from source to destination in Java深度优先搜索的递归实现以在Java中查找从源到目的地的路径
【发布时间】:2013-11-19 23:46:37
【问题描述】:

我有这个工作代码,用于以非递归方式查找源到目标之间的路径。 我想递归地实现,但我很难做到。

这是我的非递归实现代码

public boolean depthFirstSearch(String name1, String name2){
        Vertex source = vertexMap.get(name1);
        Vertex dest = vertexMap.get(name2);
        clearAll();

        Stack<Vertex> stack = new Stack<Vertex>();
        source.setVisited(true);
        stack.push(source);

        while(!stack.isEmpty()){
            source = stack.peek();
            System.out.println(source.name);
            if (dest.name.equals(source.name))
                return true;
            Vertex v = adjacentUnvisitedVertex(source);
            if (v!=null){
                v.setVisited(true);
                v.prev=source;
                stack.push(v);
            }
            else stack.pop();   
        }
        if (!source.name.equals(dest.name)){
            System.out.println("destination cannot be reached");
            return true;
        }
        else return false;
    }

    private Vertex adjacentUnvisitedVertex(Vertex v){

        for (Edge e : v.adj){
            if (!e.target.isVisited){
                return e.target;
            }
        }

       return null;
    }

这里有一个简单的 DFS 递归实现,它访问所有节点:

static void dfs (Graphnode n) {
   n.setVisited( true );
   Iterator it = n.getSuccessors().iterator();
   while (it.hasNext()) {
      Graphnode m = (Graphnode)it.next();
      if (! m.getVisited()) dfs(m);
   }
}

我想实现在两个节点 A 和 B 之间查找路径。 因此 dfs 将采用两个节点并递归查找路径。

谢谢

【问题讨论】:

    标签: algorithm recursion graph path depth-first-search


    【解决方案1】:

    您执行 stack.push() 的地方似乎是递归调用的自然位置。 pop() 应该可能对应于返回 false 作为结果。

    但也许将递归的dfs() 函数转换为您需要的函数更直接:

    1. dfs() 转换为您的目标数据结构(Graphnode -> VertexIterator... -> while(adjacentUnvisitedVertex(...) 等)。检查它是否适用于System.out.println()。这可能是最难的部分。如果您卡在那里,请在此处发布输出。

    2. 只需添加一个dest 参数并检查节点是否匹配(在这种情况下返回true,否则在循环后返回false)。确保在循环中检查递归 dfs() 调用的结果,如果找到该元素,则返回 true

    【讨论】:

    • 递归时这个“depthFirstSearch(String name1, String name2)”会如何发生?传递 name1 和 name2 一样吗?
    • 我会将递归放在一个单独的辅助方法中,该方法采用 Vertex sourcedest 参数。您不想在递归方法中进行包括clearAll() 在内的一次性设置。顺便说一句:你为​​什么要做dest.name.equals(source.name) 而不仅仅是dest == source
    • 做 dest==source 检查身份是否正确..但我认为在这里应该没关系。事实上,顶点不需要正确实现equals方法?
    • 不明白如何实现递归?你能给出更具体的步骤吗?谢谢
    • == 比 equals 快,如果您打算检查身份,这是正确的做法。节点相等是什么意思?由于连接,它们无论如何都不必相同吗?回复:更具体的步骤:我在上面的答案中添加了一些细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多