B树和B+树

当数据量大时,我们如果用二叉树来存储的会导致树的高度太高,从而造成磁盘IO过于频繁,进而导致查询效率下降。因此采用B树来解决大数据存储的问题,很多数据库中都是采用B树或者B+树来进行存储的。其目的就是减少磁盘IO,提高查询效率。

B树特性

B树中每个节点可以有多个关键字,并且每个节点可以有多个孩子。具体特性如下:

  • B树中所有节点的孩子节点数中的最大值称为B树的阶,记为M
  • 树中的每个节点至多有M棵子树
  • 若根节点不是终端节点,则至少有两棵子树
  • 除根节点外所有非叶节点至少有m/2棵子树
  • 所有非叶节点结构如下
n P0 K1 P1 K2 P2 Kn Pn

其中,n为节点中关键字的个数,Ki(i=1,2,3…n)为节点的关键字,且满足K1<K2<…<Kn;Pi(i=0,1,…,n)为指向子节点的指针,且Pi-1指向的节点中所有的关键字都小于Ki,Pi指向的节点中所有的关键字都要小于Ki。比如:P1指向的节点中所有的关键字都要小于大于K1且小于K2

  • 所有的叶节点需要出现在同一层次上
  • 树中所有节点的平衡因子都等于0

image

三阶B树

B树的查找


在B树上进行查找和二叉树的查找很相似,二叉树是每个节点上有一个关键子和两个分支。B树上每个节点有K个关键字和K+1个分支。二叉树的查找只考虑向左还是向右走,而B树中需要由多个分支决定。

B树的查找分两步,首先查找节点,由于B树通常是在磁盘上存储的所以这步需要进行磁盘IO操作。第二步是查找关键字,当找到某个节点后将该节点读入内存中然后通过顺序或者折半查找来查找关键字。若没有找到关键字,则需要判断大小来找到合适的分支继续查找。

B树的插入

B树的插入过程比较复杂,具体分为以下几个步骤:

  1. 定位:利用B树的查找算法,找出插入该关键字的最底层的某个叶子节点。
  2. 插入:找到欲插入的节点后,先进行插入操作。然后进行判断,如果当前节点中关键子的数量小于等于M-1(M为树的阶,即一个节点最多有3棵子树,那么该节点最多有两个关键字),则表示插入成功。否侧对节点进行分列处理
  3. 分裂方法:创建一个新节点,将插入KEY后的原节点从中间位置将其中的关键字分为两部分,左边的一部分保留在原节点中,右部分包含的关键字放到新的节点中,中间位置(m/2取上限)的节点插入到原节点的父节点中去。若此时导致其父节点的关键字个数也超过了上限,则继续进行这种分裂操作,直到这个过程传到根节点为止。

下面是一个三阶B树的插入过程。

image

当插入一个关键字60后,节点内的关键字个数超过出了m-1=2,此时必须进行节点分裂,分裂的过程如上图所示。

posted @ 2016-11-07 14:51  被罚站的树  阅读(2731)  评论(0编辑  收藏  举报