顺序构造完整B树

时间:2010-08-03 21:46:01

标签: algorithm b-tree

如果我有一个有序的数据集,我希望以一种最适合顺序读取和随机查找的方式存储在磁盘上,似乎是B-Tree(或其中一个变体是不错的选择......假设这个数据集并不都适合RAM)。

问题是可以从一组有序的数据构建完整的B树而不进行任何页面拆分吗?这样排序后的数据就可以按顺序写入磁盘。

3 个答案:

答案 0 :(得分:3)

根据这些规范构建“B +树”很简单。

  1. 选择分支因子k。
  2. 将已排序的数据写入文件。这是叶级别。
  3. 要构建下一个最高级别,请扫描当前级别并写出每个k th 项目。
  4. 当前级别有k项或更少时停止。
  5. k = 2的例子:

    0 1|2 3|4 5|6 7|8 9
    0   2  |4   6  |8
    0       4      |8
    0               8
    

    现在让我们来寻找5。使用二进制搜索查找顶级小于或等于5的最后一个数字,或0。查看与0对应的下一个最低级别的区间:

    0       4
    

    现在4

            4   6
    

    再次4

            4 5
    

    找到它。通常,j th 项对应于下一级别的项目jk到(j + 1)k-1。您还可以线性扫描叶级别。

答案 1 :(得分:1)

我们可以一次制作B树,但它可能不是最佳的存储方法。根据您进行顺序查询与随机访问查询的频率,最好将其按顺序存储并使用二进制搜索来为随机访问查询提供服务。

那说:假设b树中的每条记录都包含(m - 1)键( m > 2,二进制情况略有不同) 。我们希望同一级别的所有叶子和所有内部节点至少具有(m - 1)/ 2 键。我们知道高度为 k 的完整b树具有(m ^ k - 1)个键。假设我们总共要存储 n 个键。设 k 是最小的整数,使得 m ^ k - 1> Ñ。现在,如果 2 m ^(k - 1) - 1< n 我们可以完全填满内部节点,并将其余的密钥均匀地分配给叶子节点,每个叶子节点得到的楼层或天花板(n + 1 - m ^(k - 1))/ m ^(k - 1)键。如果我们不能这样做,那么我们就知道我们已经足够在至少中途填充深度为 k - 1 的所有节点,并在每个叶子中存储一个密钥。

一旦我们确定了树的形状,我们只需要按顺序遍历树,然后按顺序将键移动到位。

答案 2 :(得分:0)

最佳意义,即数据的inorder遍历将始终通过文件(或mmaped区域)向前搜索,并且在最少数量的搜索中进行随机查找。