【问题标题】:Is there a way to evaluate the number of leaves needed by a B+-tree?有没有办法评估 B+-树所需的叶子数?
【发布时间】:2019-02-17 11:21:52
【问题描述】:

如果我有 t = #tuples(或 #records)并且我可以利用的唯一其他信息是我的 B+-tree 的扇出 F,有没有办法获得多少叶子(叶子的 #blocks)树会需要吗?假设树必须是平衡的,因此在尽可能少的空间中保留最多的信息。

示例:t = 40K,F = 40 ==> 深度 = log_40(40K) = 3,#leaves = ???

【问题讨论】:

    标签: algorithm data-structures tree b-tree


    【解决方案1】:

    B+ tree 中,实际记录是从叶子中引用的。另一方面,内部节点不直接引用记录,而是定义键值的范围,以便遍历树到最终具有感兴趣记录的键值的叶子(块)。

    B+树的另一个性质是内部节点的子节点数不仅有上限(即扇出F),还有下限:F/2。 (我忽略了根不受此下限规则的约束)。这个 1/2 系数就是填充因子 (0.5)。

    叶子块的数量(L)受记录数量(t)和扇出(F)的约束,但并不是说树是(不)平衡的。在最好的情况下,我们有:

          min(L) = ⌈ t / F⌉

    在最坏、最大的情况下:

          max(L) = ⌈ 2t / F⌉

    如果您有不同的填充因子 (c >= 0.5),那么最坏的情况是:

          max(L) = ⌈ t / cF⌉

    请注意,增加填充因子会减少已用空间,但会增加插入记录时的时间开销。当填充因子接近 1 时,空间使用量保持在最低限度,但更新会很慢。

    【讨论】:

    • 我明白了.. 你能告诉我填充因子 f 会如何影响这个评估吗?例如,具有 f = 50%(我认为这意味着每个叶块必须填充其大小的 50%,对吗?)
    • 填充因子确实是(对于内部和叶块),并且对于 B+ 树必须至少为 50%。如果增加它,L 会减少。我刚刚在我的回答中添加了这个。
    • 非常感谢@trincot!准确简洁:)
    • 抱歉,我还有一个疑问。树的深度和树的级别有什么区别?根据我的理解,基本上级别 = 深度 + 1,其中深度 = #arcs 从叶到根。在 B+-tree 中进行一般查找的成本是多少?阅读关于数据库 2 的讲座并不清楚.. 有时你知道树的层次,有时你有深度,但有时它们被认为是同义词。如果我的深度 = 3,假设一般查找需要 3 次 i/o 操作(到达叶子的 3 次访问)是否正确?那么基于级别的成本呢?
    • 确实,级别 = 深度 + 1。只有一个块(根)的树将具有 1 级和 0 深度。在计算查找的成本(时间复杂度)时,两者之间的差异并不重要(不显着),因为它代表一个常数(即 1)。我们使用big-O notation 表示成本,O(level) = O(depth)。您对 i/o 操作的数量是正确的。一个级别的成本,即一个节点上的成本是 O(F),但由于这些通常是快速的内存操作,有些人会将其视为独立于 F 的恒定成本。
    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2015-03-16
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多