Java B+;树优先插入
我正在尝试用java实现B+树。如果第一次插入只保存在叶中,或者有两个条目,即一个在根中,指向叶,另一个在叶中(带数据指针),我会感到困惑 如果我尝试在这两个字段中输入它,我将有两个几乎为空的叶节点 如果我只是在leaf中输入,我的根将是leaf类型。我不确定根是否可以是叶子类型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
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];
}
}