【问题标题】:Converting a Breadth First Search to Depth first Search in Java在 Java 中将广度优先搜索转换为深度优先搜索
【发布时间】:2011-10-13 19:34:30
【问题描述】:

我已经很久没有接触 Java 了,所以这似乎是一个奇怪的问题。目前有我在 StackOverflow 上找到的广度优先搜索代码,我已对其进行了修改,但我将在此处发布原始代码。

public List<Node> getDirections(Node start, Node finish){
    List<Node> directions = new LinkedList<Node>();
    Queue<Node> q = new LinkedList<Node>();
    Node current = start;
    q.add(current);
    while(!q.isEmpty()){
        current = q.remove();
        directions.add(current);
        if (current.equals(finish)){
            break;
        }else{
            for(Node node : current.getOutNodes()){
                if(!q.contains(node)){
                        q.add(node);
                }
            }
        }
    }
    if (!current.equals(finish)){
        System.out.println("can't reach destination");
}
return directions;
}

我知道那里有其他深度优先搜索算法,但我也被告知可以轻松地将广度优先搜索转换为深度优先搜索,如果对这段代码而不是 2 进行处理,我会更好地理解它完全不同的代码。

如何将其更改为深度优先搜索?

【问题讨论】:

  • 您是否尝试过自己将其转换为 DFS?如果是这样,什么不起作用?
  • 只是一个提示:我记得不久前,如果你以这种方式编写算法,你可以通过在 LIFO 和 FIFO 数据结构之间切换来在 DFS 和 BFS 之间切换,例如 Stack或队列。
  • @user799211:要从左侧向下移动,您可以使用List outNodes = new ArrayList(current.getOutNodes()); outNodes.removeAll(q); q.addAll(0, outNodes);

标签: java algorithm search depth


【解决方案1】:

深度优先和广度优先之间的主要区别在于您探索“前沿”(您尚未探索的节点列表)中的节点的顺序。

如果您将当前节点的传出节点添加到该列表的末尾,您将在进入下一个级别之前测试“级别”中的所有可能性(为简化起见,将其想象为一棵树) ,因此您可以进行广度优先搜索。

另一方面,如果您在之前添加的节点(属于树的“上”层)之前探索新添加的节点(从当前位置传出的节点),那么您'将首先探索树的深度。

在数据结构方面,你想要一个堆栈而不是一个队列,但我认为解释可能会派上用场。

【讨论】:

    【解决方案2】:

    您必须将q.add(node)(添加到列表末尾)替换为q.add(0, node)(添加到开头)。基本上,使用stack 而不是queue

    显然您必须使用List 接口而不是Queue 来访问LinkedList

    【讨论】:

    • 这里的 Deque 会比 List 好。
    • 我将List 用于removeAll()addAll(),并在我反对深度代码块嵌套的运动中删除for 循环。
    【解决方案3】:
    Deque<Node> q = new LinkedList<Node>();
    

    并使用poppush 而不是removeadd

    基本上从您添加的同一侧删除(正常 removeadd 是 LIFO 队列基本操作)深度首先使用 FIFO 堆栈

    和其他搜索算法基本相同,但使用不同类型的队列(例如,急切搜索使用最简单的下一步)

    【讨论】:

      【解决方案4】:

      QueueLinkedList 替换为Stack,将add 替换为push,将remove 替换为pop

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        相关资源
        最近更新 更多