拆分B +树根

时间:2016-04-25 00:10:16

标签: tree b-tree

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

我的问题在于n = 5等于奇数。就像在这种情况下, 10 20 30 40 / | | | \

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

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

其中所有子项都为null。让我们说我想加50。

它会是什么样的

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

# Get all possible combinations of four rows
combn_df <- as.data.frame(t(combn(1:nrow(df), 4, sort)))

# Test each combination of four rows for both conditions
combn_df$weightsInRange <- apply(combn_df, 1, function(x) between(sum(df$Weight[x]), 800, 1100))
combn_df$unitsMean61 <- apply(combn_df, 1, function(x) mean(df$Units[x[1:4]]) == 61)

# Select combinations of rows that meet both conditions
combn_df <- combn_df[combn_df$weightsInRange & combn_df$unitsMean61, ]

# Extract two sets of four rows from original DF into two separate data frames
apply(combn_df[1:2, ], 1, function(x) df[x[1:4], ])

或其他不同的东西?

1 个答案:

答案 0 :(得分:1)

如果您拆分包含n个密钥的节点 - 包括导致拆分的传入密钥 - 那么(n - 1) / 2个密钥将转到一个新的孩子,n - 1 - (n - 1) / 2转到另一个,并且一个键上升到父级别(作为分隔符键)。上升的关键不一定与导致分裂的关键字相同。如果分隔符无处可去,那么您将拥有一个新根,并且分隔符键将是其单个占用者(最小占用率要求不适用于根节点)。

当然,如果你看一下新分隔符后剩下的剩余部分,公式看起来会更友好:r = n - 1为一方提供r / 2,为另一方提供r - r / 2。 / p>

换句话说,在正常情况下,两个“一半”最多相差一个,如果总键数是偶数则会发生,因此当取出分隔键时会留下奇怪的休息。额外的密钥是向左还是向右都没关系。

然而,这并没有受到重创。还有其他有效的重新分发策略,最值得注意的是Knuth's B*,其中两个完整节点使三个节点已经满2 / 3rds,依此类推。这也表明分裂/合并逻辑与不改变结构的再分配措施密切相关,即兄弟姐妹之间的密钥捐赠和借用。