【问题标题】:B+ Tree first insertB+ 树先插入
【发布时间】:2015-09-16 15:46:28
【问题描述】:

我正在尝试在 java 中实现 B+ 树。如果第一个插入仅保存在叶子中,或者有 2 个条目,即根中的一个,指向叶子和叶子中的一个(带有数据指针),我会感到困惑。

如果我尝试在两者中输入它,我将有 2 个几乎为空的叶节点。

如果我只是在叶子中输入它,我的根将是叶子类型。我不确定 root 是否可以是叶子类型。

public class BTree {
    private BTreeInnerNode root;
    private int fanout = 3;
    public BTreeInnerNode getRoot() {
        return root;
    }

    public BTree(int fanout) {
        this.fanout = fanout;
    }

    public BTree(){
        root = new BTreeInnerNode(fanout);
    }
}

节点

public class BTreeInnerNode extends BTreeNode {
    public BTreeNode[] children;
    public BTreeInnerNode(int fanout){
        super(fanout);
        nodeType = NodeType.Node;
        children = new BTreeInnerNode[2*fanout];
    }
}

叶子

public class BTreeLeafNode extends BTreeNode {
    public int[] rid;
    public BTreeLeafNode(int fanout) {
        super(fanout);
        nodeType = NodeType.Leaf;
        rid = new int[(2*fanout)-1];
    }
}

感谢您的帮助。

【问题讨论】:

  • 不应该所有节点都是Node类型吗?
  • 我有一个 Node 和 Leaf 的基类,因为它们都有一些共同点,但是 Node 会存储指向下一个节点或叶子的指针,而叶子只会存储记录 id,所以我创建了 2亚型
  • 每个节点都有一个值,如果“NextNode”为空,那么它就是一个叶子节点。你不需要两个子类型
  • @Steve 叶子节点和 B+ 中的内部节点在概念上是不同的——其中一个存储实际数据,另一个存储一组键。虽然在这个特定的实现中,数据本身被用作键,但我认为保持类型不同会更好。
  • @IvayloStrandjev 没关系,每个节点内的数据可以代表“实际”数据,或者关键取决于它是否有更多的孩子。这将使插入更容易,因为您不需要每次都转换类型

标签: java algorithm b-tree


【解决方案1】:

在 B+ 中,数据条目仅存储在叶中,内部(非叶)节点仅存储键。是否允许根本身成为叶是您的决定,但我认为如果根从不是叶节点并且在第一次插入时创建一个后继叶节点,那么实现会稍微容易一些。在您的实现中,数据和密钥似乎是同一件事,这就是造成混乱的原因。我仍然建议您考虑这两个不同的东西 - 内部节点中的值是“键”,叶子中的值是“数据”。这将使您更容易更改 B+ 树以存储不同的内容。

【讨论】:

  • 如果我让它们不同,并且我插入第一个键为 10,root 将持有 10,右指针将持有 ref 到具有键 >= 10 的叶子,现在叶子将持有只有 10 个,但是对于
猜你喜欢
  • 2013-04-10
  • 2012-01-18
  • 2012-04-10
  • 2016-03-02
  • 2021-08-27
  • 2011-05-20
  • 2019-12-02
  • 2011-07-24
相关资源
最近更新 更多