B-树

 

一、B树的定义

 
  此处文字B树定义转载于此:https://www.cnblogs.com/nullzx/p/8729425.html 侵权立删 (图片自己老师课件和自己画的) 
 
  B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下:
  1)每个结点最多有m-1个关键字。
  2)根结点最少可以只有1个关键字。
  3)非根结点至少有Math.ceil(m/2)-1个关键字。
  4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
 
 
 
  ——>>> 注意:
 
  上图中的叶子结点也是有五个域,只是简写了三个指针域(4阶省略了4个指针域)而已。所有结点的域都是一样的。
 
  叶子结点的键值是有顺序的。
 

二、B树的构建

 
  m阶B树允许每个结点最多有m-1个键值(Key值),m个指针。
 
  4阶B树允许每个节点最多有3个键值、4个指标。4阶B树又称为2-3-4树。
 
  • B树允许多个键值存放在一个节点。其每个节点内的键值是经过排序的,以方便搜寻。如果节点存放的键值数目达到上限,就分裂成两个新节点,并将中间的键值向上插入其父节点(没有达到上限不用分裂)。这种树状结构可保证所有叶节点都处于同一个高度。
 
  • 如果达到上限时,结点中的键值个数为奇数的时候,只需要将中间值马上去即可;如果是偶数,可以选择中间的前一个或者中间的后一个都可以。
 
  logm(n+1) ≤ h ≤ logd(n+1)/2+1
  注: m:子树的数量(order),d=┌m/2┐,n:键值数据的数量
 
【示例】
 
  以下示范一个4阶B树的建构过程。
 
  ① 假设输入的数据库为{ A, S, E, A, R, C, H, I, N, G, E, X, A, M, P, L, E },加入ASE时因为没有超过上限,所以不用分裂。第二个A加入到{A, E, S}节点后,将会超过2-3-4树的限制。这时候便要将{A, A, E, S}予以分裂(超过限制所以要分解),并将其中间值E取出成为父节点。
 
 
 
 
  
  ② 插入新键值I后,{H, I, R, S}需要分裂成{H, I}和{S} 。中间值R则向上插入其父节点。
 
 
  也可以提中间值I上去:
 
  ③插入新键值G后,{G, H, I, N}需要分裂成{G, H}和{N} 。中间值I则向上插入其父节点。
 
 
  三、B树的插入操作
 
  B树键值插入的原则,是必须确保插入后仍符合B树的特性:
 
  1. 经过类似搜寻的过程,找到第一个可插入点(一定是树叶)。
 
  2. 如果此树叶的数据字段有空位,将新键值插入适当顺序的数据字段。
 
  3. 如果树叶的数据字段已经额满没有空位,则树叶进行节点分裂(split),并且分配数据键值到两个树叶,同时将中间的键值
(第┌m/2┐个,这是偶数中间值的后一个,当然也可以前一个)往上插入父节点。
 
  4. 父节点的插入过程如同步骤2和步骤3,如果此节点还需要分裂,则一直重复。因此每次插入最多可能使B树的高度h增加1。
 
【示例】
 
 
  ① 插入21:因为有空位,直接加入即可。
 
  
  ② 插入74:插入的结点有空位,但是由于叶子结点的键值有顺序,所以77和74换位置。
  
  ③ 插入43:因为结点中有33和40,已经满了,此时43插入之后,即为{33,40,43}。40是中间值,所以将40往他的父节点c上提,{33,40,43}结点分裂,以40为界限分为两个结点,c中因为有空位,所以将40放入,但是要保持顺序性,故47往后面的位置移动,让分裂出来的两个结点分别作为中间值40的左右子树,而47的右孩子继续指向49结点。
 
  ④ 加入37,同样没问题。
 
 
  ⑤ 加入39,{33,37}变成了{33,37,39},超过上限,所以需要分裂,变成{33}和{39}两个结点,中间值37往父节点c上提,但是有{40,47},此时变为{37,40,47},还是超过了上限,继续分裂为{37}和{47}两个结点,中间值40往父节点a上提,{30,60}变为{30,40,47},继续分裂为{30}和{60}两个结点,中间值继续往上提,创建一个新的结点作为根节点,
 
  具体过程:
 
  所有与变动无关的结点指针所指向的结点都是不变的,比如47的两个指针原来指向43和49,变动之后还是指向他们两个。而本来40是指向33和37的,分裂之后的37代替了40结点,应该要替他指向33和39。同理,30和36结点没有分裂之前指向的是40和47结点,那么30和36分裂之后也要指向这个结点(虽然他们分裂为了37和47两个结点)。

  四、应用

 
  B树的方法主要是要应用在大型文件系统中。 –因其内存有限,再加上数据量很大时,我们无法一次 将整个树状结构加载内存来运算。
   –所以,树状结构会存放在像硬盘这样的储存装置中, 通常每个节点会配置一个储存单位以方便存取。 –当B树的节点数越少,高度越低,则存取磁盘的次数就 越少,效能也就越好。
 

  五、B+树

 

posted @ 2019-05-22 22:32  ZhangYS-  阅读(661)  评论(0编辑  收藏  举报