Java 如何创建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作为输入,我得到以下树:

我想了解如何创建一个顺序(分支因子)为3、节点中最大条目数为3的B+树。我搜索了很多小程序,但大多数都不能正常工作,而最棒的小程序似乎没有遵循我在维基百科上找到的这些步骤

遵循这些步骤

  • 如果存储桶未满(插入后最多b-1个条目),则添加记录
  • 否则,将铲斗分开
  • 分配新叶并将桶的一半元素移动到新桶
  • 将新叶的最小键和地址插入父级
  • 我认为新值的插入应该发生在步骤4之前。这个算法有更好的描述吗

    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