B+树被用作数据索引,帮助数据库高效获取数据的一种数据结构。
多路查找树
又称m-way
查找树是是一种树形的存储结构,主要特点如下,
- 每个节点存储的key数量小于m个
- 每个节点的度小于等于m
- 节点key按顺序排序
- 子树key值要完全小于、大于或介于父节点之间
以下是3路查找树的结构图
和二叉搜索树的功能相似
Btree查找树
Btree可以看作
是一种平衡的多路查找树,他是针对磁盘而设计的数据结构(具体可参考算法导论),减少读出/写入页次数。
主要特点如下,
1)每个节点x有三个属性:
a、x.n—>关键字个数
b、关键字递增排序
c、x.leaf—>节点是否属于叶子节点
2)每个节点有x.n+1个孩子节点,叶节点没有子女。
3) 其左孩子节点<每个节点关键字 < 其右孩子节点
4)每个叶子节点具有相同的深度,即树的高度h。
5)每个节点用最小度数 t 来表示其关键字个数的上下界,或者孩子节点(分支因子)的个数的上下界。一般,每个非根节点中所包含的关键字个数 j 满足:
t-1 <= j <= 2*t - 1
根节点至少包括一个关键字,若非叶子节点,则至少两个分子,即 t>= 2。
Btree的插入
假设初始的B树如下:
经过一系列的插入操作后:
这棵B树T为3.所以 2<=节点个数<=5
图(b) B被插入,这是一个对叶结点的简单插入
图(c) Q被插入,叶结点[RSTUV]分裂成 【RS】【UV】
图(d) L被插入, 我们看到 ROOT 被拆分了,L明明还能放入 【J,K】的框中,问题是当程序执行到ROOT节点的时候,程序无法判断下面节点的容量,所以先将ROOT拆分(防止最坏的情况)。 B树的设计只有父亲可看儿子,不能儿子看完之后,回到父亲的操作(减少对磁盘的页的读取次数)。
图(e) F被插入,叶结点[ABCDE]分裂成 【AB】【DE】,C向上插入成【CGM】,现插入F到【DEF】
Btree的删除
经过上面的插入操作后,紧接在进行一系列删除操作:
图(b) F被删除,这是一个对叶结点的简单删除
图(c) M被删除,叶结点[JKL] 中 L为M前驱被提升为M位置,前驱节点如果少,则后继补
图(d) G被删除, 拿G的前驱和后继去替换G的位置,都将导至 前驱/后继节点数<2,下降G合并结点,然后现删除G得【DEJK】
图(e) D被删除,ROOT发现【C,L】已经只有2个关键字,最坏的情况出现 应该以P为节点左旋,但【T,X】也只有2个, 【P】下沉和【TX】合为【CLPTX】
图(f) B被删除,以E为节点做左旋
Btree的代码