Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是DFS、BFS图的正确实现吗_Java_Breadth First Search_Depth First Search - Fatal编程技术网

Java 这是DFS、BFS图的正确实现吗

Java 这是DFS、BFS图的正确实现吗,java,breadth-first-search,depth-first-search,Java,Breadth First Search,Depth First Search,我正在学习搜索算法BFS和DFS。我计划实现这两个功能,但在实现之前,我需要实现我的图形结构。以下是我的想法: 连接城市的图形:每个城市由一个节点表示。 我们的图将只是一个在创建节点时添加的节点的ArrayList,每个节点都有一个它的邻居列表,以及一个父节点,它将让我们知道我们来自何处(用于路径检索)。我还没有写任何东西,我想在花时间写一些行不通的东西之前,得到一些关于我想法的反馈。这是一些伪代码。我看到的一个潜在问题是,我们将如何处理可以从多个地方(多个父节点)到达的节点。如果有人对此有任何

我正在学习搜索算法BFS和DFS。我计划实现这两个功能,但在实现之前,我需要实现我的图形结构。以下是我的想法:

连接城市的图形:每个城市由一个节点表示。 我们的图将只是一个在创建节点时添加的节点的ArrayList,每个节点都有一个它的邻居列表,以及一个父节点,它将让我们知道我们来自何处(用于路径检索)。我还没有写任何东西,我想在花时间写一些行不通的东西之前,得到一些关于我想法的反馈。这是一些伪代码。我看到的一个潜在问题是,我们将如何处理可以从多个地方(多个父节点)到达的节点。如果有人对此有任何建议,欢迎分享

 public class Node{
     String name;
     Node parent;
     ArrayList<Node> neighbors; 

    public addNeighbor(Node n);
    public setParent(Node n);
    public getNeighbors()
    ...
 }

 public static void main(String[] args){
     ArrayList<Node> graph = new ArrayList<Node>(); 
     //build node
     Node node = new Node(String name);

     //add neighbors
     node.addNeighbor(neighbor1);
     node.addNeighbor(neighbor2);

     //set parent
     node.setParent(parent1);

     //add to graph
     graph.add(node);

     path = dfs(graph, startNode, goalNode);
     System.out.print(path);
 }
公共类节点{
字符串名;
节点父节点;
ArrayList邻居;
公共addNeighbor(节点n);
公共集合父节点(节点n);
公共关系
...
}
公共静态void main(字符串[]args){
ArrayList图形=新的ArrayList();
//构建节点
节点节点=新节点(字符串名称);
//添加邻居
node.addNeighbor(neighbor1);
node.addNeighbor(neighbor2);
//设置父项
node.setParent(parent1);
//添加到图形
添加(节点);
路径=dfs(图形、起始节点、目标节点);
系统输出打印(路径);
}

编辑:我知道我可以在网上很容易地找到这方面的实现,但我更愿意提出自己的解决方案。

您的实现看起来不错。这是一个典型的图结构的实现(一个节点有一个邻居列表)。有几点:

  • 您可以使用回溯来处理到达同一节点的多条路径。如果dfs方法具有递归实现,那么如果节点已有父节点,则需要避免递归调用。但是,如果新路径比旧路径更好,则放弃旧的父路径,并设置新路径
  • 您的实现是一个方向图。换句话说,你可以构建一个从a到B有路径的图,但是没有从B到a的路径。我不知道这是否适合你
  • 我建议您将图形的构建封装在包装器中,通过对方法的唯一调用自动构建两条路径。这样,您总是可以构建双向路径

  • 您可以使用集合来存储邻居。这样,就不会有重复。当然,您需要在Node类中实现“equals”方法

在我的例子中,我需要路径A->B和B->A才能存在。我能不能把B加在A的邻居身上,把A加在B的邻居身上,这不管用吗?有可能,是的。但也有可能建立一个“不正确”的图表。我认为最好的解决方案是将图形的构建封装在包装器中,通过对方法的唯一调用自动构建两条路径。这样,您总是可以构建双向路径。有趣的是,可以同时添加每个邻居。那么你的意思是:node1.addNeighbor(node2),node2.addNeighbor(node1)吗?如果我们这样做,我们将必须确保注意重复。你可以使用一个集合来存储邻居。这样,就不会有重复。当然,您需要在Node类中实现“equals”方法。