分层数据结构设计

时间:2013-11-22 12:52:44

标签: java algorithm data-structures

我有一个分层数据。类似的东西:

enter image description here

以下是特征:

  1. 节点可以包含任意数量的子节目
  2. 节点可以标记为特殊节点。将节点标记为特殊节点后,从该节点开始的整个子树将变为特殊节点。
  3. 以下是我想要执行的操作:

    1. Tree.get("a.b.d.g")应该为我提供节点g
    2. 设置节点Tree.set("a.b.d.g",value)的值的
    3. g
    4. 在任何节点我应该知道谁是根节点
    5. 如果我是特殊子树的一部分,我应该在任何节点
    6. 我应该能够将子树复制/移动到另一棵树
    7. 我可以添加新节点或删除每个级别的新节点
    8. 我应该能够序列化这些数据
    9. 我现在可以想到“hashmap的hashmap”这种数据结构。我总是可以在每个节点上缓存操作3和4的答案。当然,我需要在复制或移动等时清除缓存......

      是否有其他实现方法可以在内存占用最少的情况下从上述操作中获得最佳性能。

1 个答案:

答案 0 :(得分:0)

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

public class TreeNode {

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

    ...
}

每个节点都有一个String id,对其父节点的引用,并引用其子节点。 你可以通过迭代getParent()直到它的null(使用递归)来获得最高根。

对于解析路径,想象一下:

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中存储和显式命名,并充当节点之间的链接。然后,您可以在节点上执行查询(属性,与他人的关系......)。

以下是演示文稿的链接: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中实现一个多级模式树(在您的情况下,检查顶部根是很重要的:所以看起来您的模型在树上有不同的级别)。