Java 如何创建B+;树数据结构
我想了解如何创建一个顺序(分支因子)为3、节点中最大条目数为3的B+树。我搜索了很多小程序,但大多数都不能正常工作,而最棒的小程序似乎没有遵循我在维基百科上找到的这些步骤 遵循这些步骤Java 如何创建B+;树数据结构,java,algorithm,data-structures,tree,applet,Java,Algorithm,Data Structures,Tree,Applet,我想了解如何创建一个顺序(分支因子)为3、节点中最大条目数为3的B+树。我搜索了很多小程序,但大多数都不能正常工作,而最棒的小程序似乎没有遵循我在维基百科上找到的这些步骤 遵循这些步骤 如果存储桶未满(插入后最多b-1个条目),则添加记录 否则,将铲斗分开 分配新叶并将桶的一半元素移动到新桶 将新叶的最小键和地址插入父级 我认为新值的插入应该发生在步骤4之前。这个算法有更好的描述吗 以20,15,5,1,3,9,2,12作为输入,我得到以下树:
20,15,5,1,3,9,2,12
作为输入,我得到以下树:
|1|5| |
|2|5| | |9| | |
|1|2| | |3|5| | |9| | | |15|20| |
26
|-----------------------------|
8,14,20 30,34
|--------------------------| |-----------|
2,4,6 8,10,12 14,16,18 20,22,24 26,28 30,32 34,36
按照这些步骤正确吗?有人能指出一个小程序来验证这个示例吗?您的树不正确。节点(不是叶)中的每个值都应该是分支的断点。为了说明这一点,让我们考虑下面的节点:
----------------------------------------
| 7 | 23 |
----------------------------------------
| pointer to | pointer to | pointer to |
| branch with| branch with| branch with|
| values | values | values |
| < 7 | 7 <= x < 23| >= 23 |
----------------------------------------
如果我们现在在树中插入数字10,最右边的叶子会变得太满(7,8,9,10),因此必须将其分成两片叶子(1,8)和(9,10)。根据规则,将数字9(上部分割桶的最低值)发送给父级:
3,5,7,9
|---------------------|
1,2 3,4 5,6 7,8 9,10
这会使父级已满,必须将其拆分:
3,5 7,9
|-------| |---|
1,2 3,4 5,6 7,8 9,10
26
|---------------------------------------|
8,12 14,20 30,34
|-------------| |---------| |-------------|
2,4,6 8,10 12,13 14,16,18 20,22,24 26,28 30,32 34,36
拆分父节点时,新节点的第一个值将发送给其父节点。在该树中,新节点为(7,9),因此要删除并发送给父节点的值为7。由于没有这样的父节点,将创建新的根节点:
7
|---------|
3,5 9
|-------| |---|
1,2 3,4 5,6 7,8 9,10
让我们用数字20,15,5,1,3,9,2,12和b=4来构建一棵树 前三个值适合一个叶(同时是根节点): 当插入数字1时,存储桶将拆分,新存储桶的第一个值将发送给父级(新根): 应该注意的是,从未从叶节点删除任何内容。删除仅在拆分的父节点中发生 值3可以毫无问题地插入其铲斗(铲斗将变为1,3,5)。但是,尝试插入数字9会使铲斗过满(1,3,5,9),并且会开裂。新铲斗(5)的第一个值将插入父铲斗
5,15
|----------|
1,3 5,9 15,20
值2和12适合它们的存储桶而不进行拆分,因此树为:
5,15
|--------------|
1,2,3 5,9,12 15,20
看看中间节点分裂时会发生什么,让我们考虑下面的树:
|1|5| |
|2|5| | |9| | |
|1|2| | |3|5| | |9| | | |15|20| |
26
|-----------------------------|
8,14,20 30,34
|--------------------------| |-----------|
2,4,6 8,10,12 14,16,18 20,22,24 26,28 30,32 34,36
现在我们将在树中添加值13。这将触发将铲斗(8,10,12,13)分成两部分:
26
|-----------------------------------|
8,12,14,20 30,34
|-------------------------------| |-------------|
2,4,6 8,10 12,13 14,16,18 20,22,24 26,28 30,32 34,36
左中节点(8,12,14,20)的子节点太多,因此必须拆分:
3,5 7,9
|-------| |---|
1,2 3,4 5,6 7,8 9,10
26
|---------------------------------------|
8,12 14,20 30,34
|-------------| |---------| |-------------|
2,4,6 8,10 12,13 14,16,18 20,22,24 26,28 30,32 34,36
当我们拆分父节点时,我们必须应用添加的规则,即新bucket的第一项必须插入父节点并从节点中移除,即从(14,20)中移除14:
该树还用于说明规则:除第一个子树外,每个父节点都携带每个子树的最低值
问题中的例子应该是(如果我没有犯太多错误):
你能告诉我这棵树的分枝因子是4吗?另外,我不明白你所说的断点是什么意思。从我所读到的,最小的订单可以是3,虽然它可能不适合我的目的。哦,天哪。。你真棒!我真的很感激你这么做。谢谢
5
|----------|
3 15
|---| |-------|
1,2 3 5,9,12 15,20