Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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表示直接非循环图的好设计模式/结构是什么?_Java_Directed Acyclic Graphs - Fatal编程技术网

用Java表示直接非循环图的好设计模式/结构是什么?

用Java表示直接非循环图的好设计模式/结构是什么?,java,directed-acyclic-graphs,Java,Directed Acyclic Graphs,我需要在Java中存储一个相当大的直接非循环图(100000个节点的顺序,深度在7到20之间,形状不规则,平均深度13) 如果构建数据结构后我需要的主要操作是: 99%操作:查找一整套意外路径(从根到给定节点) 1%操作:查找给定节点的所有子节点,或者更常见的是查找所有祖先节点 显而易见,如果可能的话,我希望第一个操作是O(1),而不是O(平均深度) 请注意,出于这个问题的目的,数据结构只写一次:在我从节点和顶点列表构建它之后,图形拓扑将永远不会更改 我的天真实现是将其存储为以下组合: H

我需要在Java中存储一个相当大的直接非循环图(100000个节点的顺序,深度在7到20之间,形状不规则,平均深度13)

如果构建数据结构后我需要的主要操作是:

  • 99%操作:查找一整套意外路径(从根到给定节点)
  • 1%操作:查找给定节点的所有子节点,或者更常见的是查找所有祖先节点
显而易见,如果可能的话,我希望第一个操作是O(1),而不是O(平均深度)

请注意,出于这个问题的目的,数据结构只写一次:在我从节点和顶点列表构建它之后,图形拓扑将永远不会更改


我的天真实现是将其存储为以下组合:

HashMap<Integer, Integer[]> childrenPerParent;
HashMap<Integer, Integer[]> ascendantPaths; 
HashMap childrenPerParent;
HashMap上升路径;
例如,我为每个节点存储:该节点的子节点列表;另外,还有一组从该节点到根的路径


缺点:就空间而言,这似乎非常浪费(我们基本上在上升路径中存储每个内部图形节点的倍数-例如,给定大小估计,我们将在
上升路径中存储额外的100000*13=130万个节点副本,每个副本都是要创建和存储的对象)我建议使用。它是一个用Java实现的图形数据库,具有许多低级优化(例如,节点和边属性存储在它们自己的块中,以便可以打包节点标识和它们的边),并且它映射磁盘数据库。跟随边与图形中的节点数或原点上的边数无关。

这是用于一次性处理作业还是用于更持久的数据集?@chrylis-持久服务器。它将执行数以百万计的第一类访问(获取节点的上升路径),然后我推荐Neo4J。这是一个采访问题吗?@chrylis-Neo4J是否为我提供内存数据存储和O(1)GetAscendantPaths操作?如果是这样,请回答。