【问题标题】:Is it possible that B+ Tree will delete a number from its leaf node, but not from internal node?B+ 树是否有可能会从其叶节点中删除一个数字,但不会从内部节点中删除?
【发布时间】:2021-05-13 04:26:07
【问题描述】:

我有一个任务,我必须在 B+ 树中添加和删除操作。我意识到非叶节点中存在一些数字,但叶节点中没有。我立即问我的助教,“B+ 树如何包含其任何叶节点中都不存在的元素?”。他的回答是“我想象叶子节点中不存在但存在于非叶子节点中的数字是被删除的元素。”

有可能吗? 我们不是在删除 B+ 树中的每个元素时都删除它吗?

如果可能的话,你能举一个发生这种情况的插入和删除顺序的例子吗?

【问题讨论】:

    标签: database b-tree


    【解决方案1】:

    B+-trees 可以用不同的方式来实现关于非叶节点使用的键。

    这些键的目的是支持查找,即唯一的约束是每个非叶节点的键定义的间隔与后代叶节点的实际键一致。

    将在叶子节点找到的密钥作为非叶子节点的密钥重用是一种可能的做法并且很方便,因为它避免了任意“组成”非叶子密钥,但这不是 B+-trees 的要求。特别是在删除叶子键或节点时,更新所有祖先非叶子键会造成不必要的开销,不这样做效率更高。

    另一种可能的做法是使用叶键的前缀,在精神上类似于(但不一样)tries

    【讨论】:

      【解决方案2】:

      你得到的答案是正确的。这是一个顺序(最大分支因子)为 4 的 B+ 树的示例:

      要知道树包含哪些键,只需查看底层并按照(可选)链接从一个节点到下一个节点:1,2,3,4,5,6,7

      非叶​​子节点中的 3 和 5 不作为数据,而是作为分隔符。他们表示:

      • 最左边叶子中的值小于 3
      • 中间叶子的值大于等于3,小于5
      • 最右侧叶中的值大于或等于 5。

      当仅发生插入时,这些分隔符将匹配出现在底层的键,但是当键被删除时,这可能会改变。

      例如,如果我们删除键 5,所涉及的叶节点只会将其移出,无需更新:

      上面的项目符号列表中的约束仍然是正确的,这就是最重要的。

      【讨论】:

        猜你喜欢
        • 2017-03-04
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        相关资源
        最近更新 更多