【问题标题】:min/max number of records on a B+Tree?B +树上的最小/最大记录数?
【发布时间】:2013-11-20 01:19:10
【问题描述】:
【问题讨论】:
标签:
data-structures
b-tree
【解决方案1】:
我手头没有数学,但是...
基本上,影响树深度的主要因素是树中每个节点的“扇出”。
通常,在简单的 B-Tree 中,扇出是 2、2 个节点作为树中每个节点的子节点。
但是对于 B+Tree,通常它们的扇出要大得多。
发挥作用的一个因素是磁盘上节点的大小。
例如,如果您有一个 4K 的页面大小,并且,比如说,4000 字节的可用空间(不包括任何其他指针或其他与节点相关的元数据),并且假设指向任何其他节点的指针树是一个 4 字节的整数。如果您的 B+Tree 实际上存储了 4 个字节的整数,那么组合大小(4 个字节的指针信息 + 4 个字节的密钥信息)= 8 个字节。 4000 个空闲字节 / 8 个字节 == 500 个可能的子代。
对于这个人为的案例,这让你有一个 500 分的粉丝。
因此,使用一页索引,即根节点,或者树的高度为 1,您可以引用 500 条记录。再添加一个层级,您的尺寸为 500*500,因此对于 501 个 4K 页面,您可以引用 250,000 行。
显然,密钥大小越大,或者节点的页面大小越小,树的扇出能力就越低。如果您在每个节点中允许可变长度的键,那么扇出很容易发生变化。
但希望您能了解这一切如何运作的要点。
【解决方案2】:
这取决于树的数量。您必须定义此值。如果你说每个节点可以有4个孩子,那么你有1000条记录,那么高度是
最佳情况 log_4(1000) = 5
最坏情况 log_{4/2}(1000) = 10
元数为m,记录数为n。
【解决方案3】:
最好和最坏的情况取决于否。每个节点可以拥有的子节点数。对于最好的情况,我们考虑这样一种情况,即每个节点都有最大数量的子节点(即 m 表示 m-ary 树),每个节点都有 m-1 个键。所以,
第一级(或根)有 m-1 个条目
第二级有 m*(m-1) 个条目(因为根有 m 个子节点,每个子节点有 m-1 个键)
第三级有 m^2*(m-1) 个条目
……
第 H 级有 m^(h-1)*(m-1)
因此,如果 H 是树的高度,则条目的总数等于 n=m^H-1
相当于 H=log_m(n+1)
因此,在您的情况下,如果您有 n=1000 条记录,每个节点都有 m 个子节点(m 应该是奇数),那么最佳案例高度将等于 log_m(1000+1)
同样,对于最坏的情况:
级别 1(根)至少有 1 个条目(和至少 2 个子项)
第二级至少有 2*(d-1) 个条目(其中 d=ceil(m/2) 是每个内部节点(根节点除外)可以拥有的最小子节点数)
第三级有 2d*(d-1) 个条目
...
第 H 级有 2*d^(h-2)*(d-1) 个条目
因此,如果 H 是树的高度,则条目的总数等于 n=2*d^H-1 相当于 H=log_d((n+1)/2+1)
因此,在您的情况下,如果您有 n=1000 条记录,每个节点都有 m 个子节点(m 应该是奇数),那么最坏情况的高度将等于 log_d((1000+1)/2+1)