B,B+树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/y3over/article/details/86561973

  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的代码

猜你喜欢

转载自blog.csdn.net/y3over/article/details/86561973