B树和B+树

本文详细介绍了B树和B+树的概念、性质、基本操作及其应用。B树是一种多路平衡查找树,适用于文件系统和数据库索引。B+树作为B树的变形,优化了数据访问和范围查询效率。

Definition

又称为多路平衡查找树,所有结点的孩子数量的最大值称为 B B B 树的阶,通常用 m m m 表示,一棵 m m m B B B 树,要么是一棵空树要么,是一棵满足如下条件的 m m m 叉树:

  • 结点至多有 m m m 棵子树(即 m − 1 m-1 m1 个关键字)
  • 若根结点不是终端结点,那么至少有两棵子树
  • 除根结点之外的所有结点至少有 ⌈ m / 2 ⌉ \lceil m/2\rceil m/2 棵子树(即 ⌈ m / 2 ⌉ − 1 \lceil m/2\rceil-1 m/21 个关键字)

非叶结点的结构如下:

n n n P 0 P_{0} P0 K 1 K_{1} K1 P 1 P_{1} P1 K 2 K_{2} K2 P 2 P_{2} P2 ⋯ \cdots K n K_{n} Kn P n P_{n} Pn

其中:

  • n n n :这个结点包含的关键字的个数
  • K i ( i = 1 , 2 , ⋯   , n ) K_{i}(i=1,2,\cdots,n) Kii=1,2,,n:结点关键字,升序
  • P i ( i = 0 , 1 , ⋯   , n ) P_{i}(i=0,1,\cdots,n) Pii=0,1,,n:指向子树树根的指针,且指向的子树中的所有关键字都小于 K i + 1 K_{i+1} Ki+1

此外,所有的叶结点都出现再同一层,并且不携带任何的信息(判定查找失败的结点,都为空指针)

Properties

B树的最小高度

对于一棵含有 n n n 个关键字,高度为 h h h,阶数为 m m m B B B 树,其最小高度,即每个结点含有最多的关键字的时候,即 m − 1 m-1 m1 个关键字,这时关键字的个数满足:
h ≤ ( m − 1 ) ( 1 + m + m 2 + ⋯ + m h − 1 ) = m h − 1 h\le(m-1)(1+m+m^{2}+\cdots+m^{h-1})=m^{h}-1 h(m1)(1+m+m2++mh1)=mh1
即:
h ≥ log ⁡ m ( n + 1 ) h\ge\log_{m}(n+1) hlogm(n+1)

B树的最大高度

即每个结点含有最少的关键字时,此时对于一棵给定关键字个数以及阶数的 B B B 树取得最大高度。已知 B B B 树的第 1 1 1 层至少有 2 2 2 棵子树,即第 2 2 2 层至少有 2 2 2 结点,而其他的非终端结点至少要有 ⌈ m / 2 ⌉ \lceil m/2\rceil m/2 棵子树,则第 3 3 3 层至少有 2 ⌈ m / 2 ⌉ 2\lceil m/2\rceil 2m/2 个结点,第 h + 1 h+1 h+1 层时至少包含 2 ( ⌈ m / 2 ⌉ ) h − 1 2(\lceil m/2\rceil)^{h-1} 2(m/2)h1 个结点。又知道,最后一层的叶结点总数为 n + 1 n+1 n+1,则:
n + 1 ≥ 2 ( ⌈ m / 2 ⌉ ) h − 1 n+1\ge2(\lceil m/2\rceil)^{h-1} n+12(m/2)h1
即:
h ≤ log ⁡ ⌈ m / 2 ⌉ ( ( n + 1 ) / 2 ) + 1 h\le\log_{\lceil m/2\rceil}((n+1)/2)+1 hlogm/2((n+1)/2)+1
最终我们得到包含 n n n 个关键字的 m m m B B B 树的高度范围为:
l o g m ( n + 1 ) ≤ h ≤ log ⁡ ⌈ m / 2 ⌉ ( ( n + 1 ) / 2 ) + 1 log_{m}(n+1)\le h\le\log_{\lceil m/2\rceil}((n+1)/2)+1 logm(n+1)hlogm/2((n+1)/2)+1

Basic Operation

Insert

联系二叉树的插入,插入的结点肯定是在某个叶结点之下,但是我们说过 B B B 树叶结点没有意义,因此插入的新关键字必定是插入到某一个最底层的非叶子结点中,有两种情况:

  • 插入之后该结点关键字个数 [ ⌈ m / 2 ⌉ , m − 1 ] [\lceil m/2\rceil,m-1] [m/2,m1]:直接插入
  • 插入之后该结点的关键字个数 > m − 1 >m-1 >m1:这时,我们需要对结点进行分裂

结点分裂
如果一个结点包含的关键字的个数大于 m − 1 m-1 m1 的话,我们将把这个结点划分为三部分以满足 B B B 树结点的定义:

  • 左部分:原来结点中在 [ 0 , ⌈ m / 2 ⌉ ) [0,\lceil m/2\rceil) [0,m/2) 的关键字,放在原来结点中
  • 右部分: ( ⌈ m / 2 ⌉ , m − 1 ] (\lceil m/2\rceil,m-1] (m/2,m1] 的关键字,放在新结点中
  • 中间:将第 ⌈ m / 2 ⌉ \lceil m/2\rceil m/2 个关键字放到前驱结点中指向原来结点指针的右边,然后再有一个新的指针在这个关键字的右边指向新的结点,完成分裂

不难理解,这将会是一个递归的操作,因为我们需要往上一层又插入了一个关键字,这时我们将再上一层重复这个步骤,直到不需要分裂,或者是到达了根结点,这时我们需要分裂根结点,然后生成一个新的根结点,显然这个新的根结点包含原来根结点的第 ⌈ m / 2 ⌉ \lceil m/2\rceil m/2 个关键字,并且有两棵子树

Delete(误)

同样,我们需要对删除该关键字之后的结点判断其关键字个数是否依然符合 B B B 树结点的定义。首先考虑非终端结点中关键字的删除。如果是非终端结点的话,这时,不够的关键字个数可以从子树中借用:

  • 如果够借,即存在一棵子树中的关键字个数大于 ⌈ m / 2 ⌉ − 1 \lceil m/2\rceil-1 m/21 ,则在子树中借用和删除值最近的关键字,然后递归的删除子树中相应的关键字,直到终端结点

Moreover

B+ 树

B+树时应数据库所需而出现的一种B树的变形,满足:

  • 每个分支结点最多有m棵子树(即 ⌈ m / 2 ⌉ ≤ n ≤ m \lceil m/2\rceil\le n\le m m/2nm
  • 结点的子树数量和结点包含的关键字个数相等(即不同于B树,B+树的关键字的个数同样也是 ⌈ m / 2 ⌉ ≤ n ≤ m \lceil m/2\rceil\le n\le m m/2nm,而不是少1)
  • 所有叶子结点包含有全部的关键字以及指向相应记录的指针,叶结点中将关键字按大小顺序排列并且相邻的叶结点按大小顺序相互链接起来(可以看作是一个顺序链表,只不过一个结点可能含有多个关键字,但是这个结点的所有关键字小于或者大于上一个结点的所有关键字)
  • 分支结点可以看成是索引的索引,仅包含子结点(即下一级的索引块)中关键字的最大值以及指向其子结点的指针

通常在B+树中有两个头指针:

  • 一个头指针指向B+树的根结点
  • 另外一个头指针是指向包含最小关键字的叶结点,即这个“叶结点链表”的头指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值