Data structures 对于n阶B树,节点必须包含的最小密钥数是多少?

Data structures 对于n阶B树,节点必须包含的最小密钥数是多少?,data-structures,Data Structures,我有两本关于数据结构的书。在这两本书中,有两种不同的B-树插入方法: 假设我想在B-树中插入一个值k。 在搜索适当的叶节点以插入值k之后,对特定叶节点中存在的值进行计数。如果叶节点已满,则: 1。从叶元素和新元素中选择一个中位数。然后将节点拆分为两个节点。中位数值移到父节点。 2.在m/2-1(m是树的顺序)位置后将节点拆分为两个节点。中值移到父节点。然后将值插入适当位置。 以下哪种方法是正确的 另一个问题: 对于n阶B-树,一个节点必须包含的最小键数是多少?我已经搜索了互联网和书籍,但无法得到

我有两本关于数据结构的书。在这两本书中,有两种不同的B-树插入方法:

假设我想在B-树中插入一个值k。 在搜索适当的叶节点以插入值k之后,对特定叶节点中存在的值进行计数。如果叶节点已满,则:

1。从叶元素和新元素中选择一个中位数。然后将节点拆分为两个节点。中位数值移到父节点。

2.在m/2-1(m是树的顺序)位置后将节点拆分为两个节点。中值移到父节点。然后将值插入适当位置。

以下哪种方法是正确的

另一个问题:

对于n阶B-树,一个节点必须包含的最小键数是多少?我已经搜索了互联网和书籍,但无法得到确切的公式,通过它我可以找到最小键数:例如,如果order=5,那么任何节点(根节点除外)的最小键数是2。这是怎么回事?


如有任何答案,将不胜感激

根据Knuth的定义,m阶B-树是满足以下属性的树:

  • 每个节点最多有m个子节点
  • 每个非叶节点(根节点除外)至少具有ceil(m⁄2)子节点
  • 如果根节点不是叶节点,则它至少有两个子节点
  • 具有k个子节点的非叶节点包含k个−1把钥匙
  • 所有的叶子都出现在同一层,并携带信息
每个内部节点的键充当分隔值,分隔其子树。例如,如果内部节点有3个子节点(或子树),则它必须有2个键:a1和a2。最左边的子树中的所有值将小于A1,中间子树中的所有值将在A1和A2之间,并且最右边的子树中的所有值将大于A2。 内部节点

内部节点是除叶节点和根节点之外的所有节点。它们通常表示为一组有序的元素和子指针。每个内部节点最多包含U个子节点,最少包含L个子节点。因此,元素的数量总是比子指针的数量少1(元素的数量介于L和L之间)−1和U−1). U必须为2L或2L−1.因此,每个内部节点至少已满一半。U和L之间的关系意味着两个半满节点可以合并成一个合法节点,一个满节点可以拆分成两个合法节点(如果有空间将一个元素向上推入父节点)。通过这些属性,可以在B树中删除和插入新值,并调整树以保留B树属性

根节点

根节点的子节点数与内部节点数具有相同的上限,但没有下限。例如,当数量少于L时−在整个树中,根将是树中唯一的节点,没有子节点

叶节点

叶节点对元素的数量有相同的限制,但没有子节点,也没有子指针

添加:

使用Knuths定义的顺序为5(最大子级数)[4是最大键数]的B树

拆分后内部节点的最小子节点数为3[2个键]。因为当一个节点溢出B树的顺序时,它会分裂

列表的B树11108326711357120806092

添加3267111081135712080后;这是显示钥匙,而不是儿童

└── 3267, 11108, 11357, 12080
然后加6092;这是显示钥匙,而不是儿童

└── 3267, 11108, 11357, 12080
拆分前(键数>顺序-1)[5>5-1=4]:

└── 3267, 6092, 11108, 11357, 12080
拆分后:

└── 11108
    ├── 3267, 6092
    └── 11357, 12080
注意:根节点没有其他节点的最小键/子节点数

删除:

删除后重新平衡

如果从叶节点删除某个元素使其小于最小大小,则必须重新分配某些元素以使所有节点达到最小大小。在某些情况下,重新分配会将缺陷转移到父级,并且重新分配必须迭代地应用到树上,甚至可能应用到根级。由于最小元素计数不适用于根,因此使根成为唯一有缺陷的节点不是问题。重新平衡树的算法如下:[需要引用]

  • 如果右同级的元素数超过最小值

    • 将分隔符添加到节点的末尾
    • 用右同级的第一个元素替换父级中的分隔符
    • 附加右同级的第一个子节点作为缺陷节点的最后一个子节点
  • 否则,如果左兄弟姐妹的 元素

    • 将分隔符添加到节点的开头
    • 用左同级的最后一个元素替换父级中的分隔符
    • 插入左同级的最后一个子节点作为缺陷节点的第一个子节点
  • 如果两个直接同级只有最少的元素数

    • 创建一个新节点,其中包含缺陷节点中的所有元素、其一个同级节点中的所有元素以及两个合并同级节点之间父节点中的分隔符
    • 从父节点中删除分隔符,并用组合节点替换分隔的两个子节点
    • 如果这使父节点中的元素数低于最小值,则对该缺陷节点重复这些步骤,除非它是根节点,因为根节点被允许缺陷
  • 唯一需要说明的另一种情况是当根没有元素和一个子元素时。在这个c
    └── 6169, 12789
        ├── 1009, 4238, 5139
        ├── 6625 
        └── 12909, 14508, 14703, 14985
    
    └── 6169, 12909
        ├── 1009, 4238, 5139
        ├── 6625, 12789
        └── 14508, 14703, 14985