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+树