Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/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_Algorithm_Data Structures_Graph - Fatal编程技术网

Java 在内存中存储父子映射。有效列出父级的所有可访问子级

Java 在内存中存储父子映射。有效列出父级的所有可访问子级,java,algorithm,data-structures,graph,Java,Algorithm,Data Structures,Graph,我在reational数据库中有父映射和子映射,如下所示 relationship_id | parent_id | child_id 1 | 100009 | 600009 2 | 100009 | 600010 3 | 600010 | 100008 对于性能优化,我喜欢将所有这些映射保存在内存中。 在这里,一个孩子将有一个以上的父母,而一个父母有两个以上的孩子。 我想,我应该使用“图形”

我在reational数据库中有父映射和子映射,如下所示

relationship_id | parent_id | child_id
1               | 100009    | 600009
2               | 100009    | 600010
3               | 600010    | 100008
对于性能优化,我喜欢将所有这些映射保存在内存中。 在这里,一个孩子将有一个以上的父母,而一个父母有两个以上的孩子。 我想,我应该使用“图形”数据结构

填充到内存是一次性的活动。我担心的是,当我要求列出所有孩子(不仅仅是直系子女)时,应该尽快返回。添加和删除很少发生。 我应该使用什么样的数据结构和算法


已尝试,以实现
O(1)
搜索时间,但它具有更多冗余。

具有用于父子关系的图形数据结构。每个GraphNode只能有一个子元素的
ArrayList

然后使用将ID映射到GraphNode的
HashMap


您需要找出一些方法,这样就不会创建一个循环(如果可能的话),从而导致无限循环。

您需要一个自定义的
节点和一个hashmap来存储节点引用,以便于查找

for each row in database
if parent node exists in map
  get it
else
  create it and add it

if child node exists in map
  get it
else
  create it and add it

set relationship between parent and child
node类看起来像

public class Node {

  private int id;

  private List<Node> parents = new ArrayList<Node>();
  private List<Node> children = new ArrayList<Node>();

  //getters and setters

}
公共类节点{
私有int-id;
private List parents=new ArrayList();
private List children=new ArrayList();
//接球手和接球手
}

我就是这么做的。但是,我需要为父母找到所有可以联系到的孩子。在这个设计中,我需要遍历每个子节点以找到到达能力。有没有办法在较少的遍历中找到所有可到达的节点。您认为遍历会有问题吗?这是一个相当标准的方法;想想树是怎么工作的。另一种方法是在每个节点上都有一个所有子代的列表,这就是我所做的。但是,我需要为父母找到所有可以联系到的孩子。在这个设计中,我需要遍历每个子节点以找到到达能力。我有没有办法在较少的遍历中找到所有可到达的节点。@克里希纳,我不确定是否能比这更好。您可以在每个节点上都有一个标志,指示您已经访问过它,这样您就不会重复任何节点。对于多个调用(以获取子体),此标志可以作为整数有效地实现,从0开始,每次调用时递增,然后仅访问节点(如果其值为!=该值,然后将每个访问的节点设置为该值。