2013-11-22 84 views
1

我有一个分层数据。是这样的:分层数据结构设计

enter image description here

以下为特征:

  1. 一个节点可以有任意数量的子
  2. 节点可以被标记为特殊的。一旦节点被标记为特殊的,从该节点开始的整个子树就变得特别。

以下是我要执行的操作:

  1. Tree.get("a.b.d.g")应该给我节点g
  2. Tree.set("a.b.d.g",value)其在任一节点设置节点g的价值
  3. 我应该知道是谁根节点
  4. 在任何节点我应该如果我是特殊子树的一部分
  5. 我应该能够在复制/移动子树到另一棵树
  6. 我可以在每个级别添加新节点或删除新节点
  7. 我应该能够序列化此数据

我能目前想想“hashmaps的hashmap”类数据结构。我总是可以缓存每个节点的操作3和4的答案。当然,我需要清除缓存时,我复制或移动等...

是否有任何其他方式的实现,以最小的内存占用从上述操作实现最佳性能。

+0

虽然没有摆动相关,但实现TreeNode始终是一个好的开始。然后,您可以复制TreeNode并使用相同的方法创建您自己的自定义界面。 – MightyPork

+1

可能是一个矫枉过正的问题,但是如何使用[Neo4j](http://www.neo4j.org/)? – bekce

+0

你是什么意思,“在任何节点,我应该知道谁是根节点”?是不是只有一个根?你的树是否以任何方式平衡? –

回答

0

对于基本的建模,你应该使用复合模式:

public class TreeNode { 

    private String id; 
    private TreeNode parent; 
    private List<TreeNode> treeNodes = new ArrayList<>(); 

    ... 
} 

每个节点都有一个串ID,其父的引用,引用它的孩子。 您可以通过在getParent()上迭代来获得顶级根,直到其为空(使用递归)。

为了解析这些路径设想是这样的:

public TreeNode get(final String path) { 
    if (!path.isEmpty()) { 
     for (TreeNode treeNode : treeNodes) { 
      if (path.startsWith(treeNode.getId())) { 
       return treeNode.get(path.substring(...)); 
      } 
     } 
    } 
    return this; 
} 

现在,如果你正在寻找一种方法来存储这种数据(图表等),并具有高性能的查询就可以了,你可以考虑使用图形数据库作为@sebgymn提到:Neo4j是一个很好的java数据库。

这是关于在NOSQL中使用连接数据模型。节点将数据存储在属性中,关系也被存储并在Neo4j中明确命名,并充当节点之间的链接。然后,您可以在Node上执行查询(属性,与其他人的关系...)。

这里是链接到一个演示:http://fr.slideshare.net/neo4j/data-modeling-with-neo4j

一个伟大的教程:http://technoracle.blogspot.fr/2012/04/getting-started-with-neo4j-beginners.html

的测试图形数据库执行查询:http://www.neo4j.org/learn/cypher

例如:你可以尝试实施多层次模式neo4j中的树(就像你的情况一样,检查顶层根是很重要的:所以你的模型看起来在树上有不同的层次)。

+1

这并不给任何查询的最佳时间。在不知道需求的相对重要性的情况下,您无法提出正确的数据结构。 –

+0

这样的事情我们已经有了。我只是寻找更好的表演选项 – anony

+0

@anony我不明白你的问题。但是如果你正在寻找性能,你应该认真考虑一个图形数据库,比如seogymn提到的Neo4j,因为它看起来你想要图表是持久的。 – zenbeni