Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 B+;树优先插入_Java_Algorithm_B Tree - Fatal编程技术网

Java B+;树优先插入

Java B+;树优先插入,java,algorithm,b-tree,Java,Algorithm,B Tree,我正在尝试用java实现B+树。如果第一次插入只保存在叶中,或者有两个条目,即一个在根中,指向叶,另一个在叶中(带数据指针),我会感到困惑 如果我尝试在这两个字段中输入它,我将有两个几乎为空的叶节点 如果我只是在leaf中输入,我的根将是leaf类型。我不确定根是否可以是叶子类型 public class BTree { private BTreeInnerNode root; private int fanout = 3; public BTreeInnerNode g

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

如果我尝试在这两个字段中输入它,我将有两个几乎为空的叶节点

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

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);
    }
}
节点

叶子


感谢您的帮助。

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

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

不是所有的节点都应该是Node类型吗?我为Node和Leaf都有一个基类,因为它们都有一些共同点,但是Node将存储指向下一个节点或Leaf的指针,Leaf将只存储记录id,所以我创建了2个子节点,每个节点都有一个值,如果“NextNode”为null,那么它就是一个Leaf。你不需要两个subtypes@SteveB+中的叶节点和内部节点在概念上是不同的——其中一个存储实际数据,另一个存储一组密钥。虽然在这个特定的实现中,数据本身被用作键,但我认为最好保持类型不同。@IvayloStrandjev其实并不重要,每个节点内的数据可以表示“实际”数据,或者键取决于它是否有更多的子节点。这将使插入变得更容易,因为您不需要每次都转换类型。不是所有节点都是类型Node吗?我为Node和Leaf创建了一个基类,因为它们都有一些共同点,但Node将存储指向下一个节点或Leaf的指针,Leaf将只存储记录id,因此我创建了2个子节点,每个节点都有一个值,如果“NextNode”为空,则它是一个叶。你不需要两个subtypes@SteveB+中的叶节点和内部节点在概念上是不同的——其中一个存储实际数据,另一个存储一组密钥。虽然在这个特定的实现中,数据本身被用作键,但我认为最好保持类型不同。@IvayloStrandjev其实并不重要,每个节点内的数据可以表示“实际”数据,或者键取决于它是否有更多的子节点。这将使插入变得更容易,因为您不需要每次都转换类型如果我使它们不同,并且我将第一个键插入为10,root将保持10,右指针将保持指向键>=10的叶的ref,现在叶将只保持10,但是如果我使键不同,将有一个左叶用于键,我将第一个键插入为10,root将保留10,右指针将保留指向键>=10的叶的ref,现在叶将只保留10,但有一个左叶用于键
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];
    }
}