B-树
B-树提出的初衷
随着存储技术的不断提高,虽然内存的绝对容量也在不断地增长,但相比于数据库容量的增长,内存的相对容量实际上是在缩小的。如我们执意的增加内存容量,则会导致其访问速度的降低,因此我们需要牺牲部分的内存容量。
由于访问外存与访问内存速度的差异,我们宁可访问内存多次也不愿访问一次外存,引入多级存储系统后,我们更希望访问的数据位于更高层的存储设备。B树即是借鉴了多级存储思路。
B-树结构
多级存储系统使用B-树,可针对外部查找,大大减少I/O次数。
B-树充分利用外存对批量访问的高效支持,将此特点转化为优点,每下降一层,都以超级节点为单位,读入一组关键码。
定义:
- 所谓m阶B-树,即为m路的平衡搜索树。
- 外部节点的深度统一相等,所有的叶节点深度统一相等。外部节点即是叶节点的数值为空,实际不存在的节点,B-树的高度也是相对于外部节点而言的。
- 内部节点有不超过m-1个关键码,不超过m个分支
- 内部节点的分支数n+1>m/2,亦称作(m/2, m)-树
紧凑表示法
BTNode定义
将超级节点的内部实现为两个vector,一个存储关键码,一个存储指向孩子节点的引用。
template<typename T> struct BTNode
{
BTNodePosi(T) parent; //父节点
Vector<T> key; //数值向量
Vector<BTNodePosi(T)> child; //孩子向量(长度比key多1)
BTNode()
{
parent=NULL;
child.insert(0,NULL);
}
BTNode(T e, BTNodePosi(T) lc=NULL, BTNodePosi(T) rc=NULL)
{