【问题标题】:Is this B+ Tree Valid?这个 B+ 树有效吗?
【发布时间】:2014-04-09 12:28:57
【问题描述】:

在B+树中,是否可以存在非叶节点以删除其键值?这意味着 B+ 树在其中间非叶节点中具有值,但在其任何叶节点中都没有。

考虑以下结构。我在研究 B+ 树时遇到了这个问题。在这个结构中,13 不是叶节点。但它是一个非叶子节点。 (其实在之前的说明中已经删掉了。Link for the picture。在这个链接里到页面底部)

如果是,那数据怎么被删除了?

这是一个错误还是我遗漏了什么?

【问题讨论】:

    标签: data-structures tree b-tree b-plus-tree


    【解决方案1】:

    您发布的图片有效。此树返回的唯一数据是您在最后一行中找到的数据。因为13 已从树中删除,所以它已从最后一行中删除。 13 存在于非叶节点中这一事实对您的结果没有影响,它只是在遍历树时存在可比较的值。在这种情况下,如果将 13 更改为 16(基于上述约定),树的行为将没有什么不同。

    Douglas Fisher 制作了一个关于 B+ 树的综合视频系列,这比阅读文章更容易学习。第 1 部分可以在 here 找到。


    编辑:我在 cmets 中的回复太长,所以我会放在这里。另外,这是有用的信息。

    如果您正在搜索12,并到达13,您将比较IS 12 < 1313 <= 12,左侧为真,因此您将向下遍历到左侧叶子。无论13 是否为16,都会发生这种情况,因为12 < 16 也是如此。

    如果您正在搜索16 并到达13,您将比较IS 16 < 1313 <= 16,正确的表达式为真,因此您将向下遍历到正确的叶子。然后你会在那里找到16 的值。

    如果你搜索13(不存在)你会问IS13 < 1313 <= 13,正确的表达式为真,所以你会向下遍历到右边的叶子,发现有那里没有13,你会在这一点上踢出13 没有价值。

    【讨论】:

    • 那么这是否意味着在非叶子节点中将 13 的值更改为 16 时,B+ 树仍将保持有效?如果是,是不是意味着在删除时我们可以根据自己的方便组织树(即为其子节点之间的非叶节点选择任何值)?
    • 正确,通过将13 更改为16,树将发挥相同的作用。结果将是相同的,即底行。非叶节点的内容只是方向,如路线图。因为美国的道路改变了,并不意味着加拿大的地图需要改变。在每个系统中删除节点的处理方式可能不同,但在优化的系统中,非叶节点只会在必要时更新,如果它们指向的值的范围发生变化。这种情况下只要12 < X <= 16X就可以是13, 14, 15, 16
    • 但是当我输入 14 或 15 时会不会有问题。B+ 树中 14 或 15 的位置会根据在 13 或 16 中放置哪个搜索值而改变。对于 13 它将进入正确的孩子,对于 16 它将进入正确的孩子。请解释一下。
    • @CrystalMeth 我已经在答案中添加了我的回复,因为在这里发布太长,并且如果没有一些换行符就很难阅读/理解
    • 我的意思是在插入期间而不是在搜索期间。在插入 14 和 15 时,树结构将变得不同。对于误导性的“输入”,我们深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2011-09-03
    相关资源
    最近更新 更多