分裂B+树根

splitting a B+ tree root

当拆分 b+ 树的根节点时,我知道你采用 n/2 +1 并将其作为新根并相应地拆分所有内容。

我的问题是什么时候n等于奇数。就像在这种情况下,n = 5.

所以让我们用一个简单的例子:

   10  20  30  40 
 /   |   |   |   \

其中所有子项都为空。可以说我想为此添加 50。

会不会像

       30
      /  \
(10,20)   (40,50) 

           40
          /  \
 (10,20,30)  (50)

还是不同的东西?

如果您拆分包含 n 个键的节点 - 包括导致拆分的传入键 - 然后 (n - 1) / 2 个键转到一个新的 child、n - 1 - (n - 1) / 2转到另一个,一个键上升到 parent 级别(作为分隔键)。上升的密钥不一定与导致分裂的密钥相同。如果分隔符无处可去,那么你就有了一个新的根节点,分隔键将成为它的唯一占用者(最低占用要求不适用于根节点)。

当然,如果您查看取出新分隔符后剩下的部分,公式看起来会更友好:r = n - 1 一侧给出 r / 2,另一侧给出 r - r / 2 .

换句话说,在正常情况下,两个'halves'最多相差一个,如果总键数是偶数就会出现这种情况,因此在取出分隔键时会留下奇数。额外的键是向左还是向右都没有关系。

然而,这并不是一成不变的。还有其他有效的重新分配策略,最著名的是 Knuth's B*,其中两个完整节点使三个节点已经满 2/3,等等。这也表明 split/merge 逻辑与不改变结构的再分配措施密切相关,即兄弟姐妹之间赠与和借用钥匙。