B树插入:在树的下降期间,为什么我们用2t-1元素分割每个节点?

问题描述 投票:0回答:2

在B树插入算法中,我看到为了解决我们需要将元素插入到具有2t-1个元素的叶子的情况,我们需要对树进行分割算法。我不明白的是为什么插入算法在树的下降期间(到意愿点)我们用2t-1元素分割每个节点,即使我似乎没用。例如example

我知道有一种情况,叶子上面的几个节点有2t-1个元素,如果我们想要移动中位数,我们就会面临问题,但为什么不给它精确解决方案,而不是每次都进行拆分时间。

如果我说错了,请纠正我。

algorithm b-tree
2个回答
0
投票

我们将整个节点拆分到目标位置,因为我们不知道是否需要“重新启动”。你可以按照你想象的方式做到这一点,我们下到目标节点,拆分它,然后将拆分的中位数插入到父节点中,根据需要递归地拆分节点。但这需要我们从根目录,到目标,然后备份,可能一直到根目录。这可能是不合需要的,例如如果两次访问节点太贵了。在这种情况下,最好直接进入一个通道,在那里拆分任何完整节点以预测需要更多空间。

对于演示,您可以尝试将10插入到图形中间和底部的树中。底部的树,未分裂,需要以与中间树相同的方式一直分割到根,因为双遍算法没有留下任何空间。在中间的树中,插入10仍会导致分裂,但它不会一直向上延伸,因为树的顶部两层非常宽敞。

但是有一个重要的警告。让t成为每个节点的最小子节点数。对于双遍算法,节点可以具有的最大子节点数必须至少为u = 2t - 1。如果它更小,如2t - 2,那么即使使用要插入的附加元素,拆分整个节点(2t - 3元素)也将无法生成两个非缺陷节点。单程算法需要更高的最大值u = 2t。这是因为双遍算法总是有一个元素可以完全取消一个缺陷。一次通过算法没有这种能力,因为它有时会不必要地分割节点,因此它不能将它所持有的元素粘在其中一个缺陷中。它可能不属于那里。


0
投票

我已经多次实现了B树,并且从未在下行过程中分割节点。

通常我会递归插入,这样node->insert(key,data)可以返回一个新的键插入父级。父节点在子节点上调用insert,如果子节点分裂,则返回父节点的新键。如果父分裂,则它将a键返回给它的父代等。

我发现插入实现可以保持这种方式非常干净。

© www.soinside.com 2019 - 2024. All rights reserved.