在java中实现DAG的不同方法
我正在实现DAG,并想知道以下是否是用Java表示它的唯一方法:在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{ 节点根;//假设只有一个根存在 } 我正在寻找一些简单的东西,没有父母和孩子的两张清
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中,因为他们是孩子(或父母)默示给你的。但是,如果在应用程序中经常需要查找给定节点的某些祖先,则父列表可能有助于实现一个快速算法来完成此操作(因为您不必总是从根开始,并可能遍历整个图形,而是尽可能从给定节点向后)。