分裂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 逻辑与不改变结构的再分配措施密切相关,即兄弟姐妹之间赠与和借用钥匙。
当拆分 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 逻辑与不改变结构的再分配措施密切相关,即兄弟姐妹之间赠与和借用钥匙。