当分割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], ])
或其他不同的东西?
答案 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,依此类推。这也表明分裂/合并逻辑与不改变结构的再分配措施密切相关,即兄弟姐妹之间的密钥捐赠和借用。