Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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中实现DAG的不同方法_Java_Data Structures_Graph_Directed Acyclic Graphs - Fatal编程技术网

在java中实现DAG的不同方法

在java中实现DAG的不同方法,java,data-structures,graph,directed-acyclic-graphs,Java,Data Structures,Graph,Directed Acyclic Graphs,我正在实现DAG,并想知道以下是否是用Java表示它的唯一方法: class Node{ List<Node> parents; List<Node> successors; int value; } class DAG{ Node root; // assuming only one root exists } 类节点{ 列出家长名单; 列出继任者名单; int值;} 类DAG{ 节点根;//假设只有一个根存在 } 我正在寻找一些简单的东西,没有父母和孩子的两张清

我正在实现DAG,并想知道以下是否是用Java表示它的唯一方法:

class Node{
List<Node> parents;
List<Node> successors;
int value; }

class DAG{
Node root; // assuming only one root exists
}
类节点{
列出家长名单;
列出继任者名单;
int值;}
类DAG{
节点根;//假设只有一个根存在
}
我正在寻找一些简单的东西,没有父母和孩子的两张清单。
可能吗?
此外,我对这种表示法也有一个问题,即如果我到达一个特定的节点x,并且想要从x到根节点的路径,那么如何在不经过所有父节点集的情况下找到它

要简化有向图结构,节点不必有回其祖先的链接。我还将节点类放在DAG类中。从概念上讲,这种表示法更有意义,因为在有向图中,如果节点a链接到节点B,则不需要从B到a的路径。事实上,两个方向上都不可能有路径,因为这将是一个循环

public class DAG {
   Node root; // assuming only one root exists

   public static class Node{
      List<Node> successors;
      int value; 
   }
}
公共类DAG{
节点根;//假设只有一个根存在
公共静态类节点{
列出继任者名单;
int值;
}
}
要找到从根节点到特定节点的路径,需要运行一个算法来搜索整个图。这意味着可以访问图中的其他节点,可能是递归的,直到找到给定的节点为止。 如果希望避免重复此类计算,还可以存储 使用类似以下内容将根指向给定节点:

class PathMap {
  HashMap<DAG.Node, List<DAG.Node> > pathMap;

  public List<DAG.Node> getPathFromRoot(DAG.Node n) {
     List<DAG.Node> pathFromRoot = pathMap.get(n);
     return pathFromRoot;
  }
}
类路径映射{
HashMap路径图;
公共列表getPathFromRoot(DAG.Node n){
List pathFromRoot=pathMap.get(n);
从根返回路径;
}
}

现在,从根到给定节点可能有几个不同的路径。在这种情况下,您可能希望实现一个查找和存储最佳路径的方法。伪代码见此。

查看此线程是否删除父列表合理取决于您的典型用例。正如索恩所指出的,原则上你可以把父母放在DAG中,因为他们是孩子(或父母)默示给你的。但是,如果在应用程序中经常需要查找给定节点的某些祖先,则父列表可能有助于实现一个快速算法来完成此操作(因为您不必总是从根开始,并可能遍历整个图形,而是尽可能从给定节点向后)。