如果我有一个有序的数据集,我希望以一种最适合顺序读取和随机查找的方式存储在磁盘上,似乎是B-Tree(或其中一个变体是不错的选择......假设这个数据集并不都适合RAM)。
问题是可以从一组有序的数据构建完整的B树而不进行任何页面拆分吗?这样排序后的数据就可以按顺序写入磁盘。
答案 0 :(得分:3)
根据这些规范构建“B +树”很简单。
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区域)向前搜索,并且在最少数量的搜索中进行随机查找。