B Tree
接下来讲B tree 平衡多路查找树
如果每个节点最多为M的孩子,那么这样的树为M阶B树。咋们可以看到上图为3阶B树的样子,当然现实中讲的索引每个节点的孩子的树上限呢,肯定是远大于3的。每个存储块中包含着关键字还有指向孩子的指针,那么最多能有几个孩子取决于每个存储块的容量,以及数据库 的相关配置,所以通常情况下这个m是很大的。
咋们想来看看B Tree的特征:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pn3YOipG-1632112341664)(ms图库/B Tree定义.png)]
-
根节点至少包括两个孩子
-
树中每个节点最多含有m个孩子(m>=2) (这个就是我们说的m阶树的含义了,m取决于起点的容量,以及相关配置)
-
除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子 (其中ceil是取上限,比如说像这里如果m为3,m/2=1.5 那么取它的上限也就是ceil的上限,它就是2。它并不是四舍五入如果是1.2那么他也是等于2。那么每个非根非叶的节点,至少具备两个孩子,就跟我们看的3阶B树一样 )
-
所有的叶子节点必须位于同一层 (即所有的叶子节点的高度必须是一样的,这是它必须遵守的一个约束,遵守这个约束目的只有一个,就是让每个索引块存储更多的信息,让树的高度尽量减少IO次数)
-
假设每个非终端结点中包含有n个关键字信息,其中
a. ki(i = 1…n)为关键字,且关键字按顺序升序排序K(i-1)<ki (如上图中 8 < 12)
b. 关键字的个数n 必须满足:[ceil(m/2)-1] <= n <= m-1 (即任意结点的关键字上限,比它的孩子树上限少1个,且对于非叶子节点来说任何一个节点的关键字个数,比它的指向孩子的指针个数少一个)
c. 非叶子节点的指针:p[1],p[2], …,p[M];其中P[1]指向关键字小于K[1]的子树,(意思是说某结点最左边孩子结点里的关键字的值,均小于该结点最前的关键字的值 如上图 8 是关键字,那么8对应它左边这个子树里面的它的孩子里关键字的值 3,5都小于8)P[M]指向关键字大于K[M-1]的子树,(就是该节点最右边的孩子结点的关键字的值,均大于该结点里所有该关键字的值 如上图13,15 大于 8,12)其它P[i]指向关键字属于(K[i-1],K[i])的子树 (意思就是该节点其余的孩子结点里的关键字的值的大小,均位于离该孩子指针最近的两个关键值之间,它是一个开区间 如上图 p2 指向的两个关键值9,10是位于8和12的开区间范围之内的)
前4条规则是用来规定B树的孩子树,和B树的深度的。而它的最后一条是用来规定B树结点的关键字数量和大小。
当我们要查找数据的时候B树是跟2叉查找树的查询效率是一样高效的。比如说我们查15那么我们首先从根部开始找15 < 17 因此它就来到p1里面,p1指向的是8,12。由于在这个节点里面15是比8和12都要大的,因此它就来到p3,p3指向叶子节点13,15在一起的我们先找13不是,那么最终找到了15。因此呢它的查找效率依然是O(longn)。
我们当数据发生变动的时候必然会发生现有结构被打乱的情况,那么我们的这个二叉查找树可能会变成线性的了,那么由于B树我们有这5个规定存在,所以B会有响应的策略,通过合并,分裂,上移,下移节点来保持它的特征 ,此树远比我们的二叉树矮得多,并且不会根据数据经过不断变动后变成线性的这种情况。
并且不会根据数据经过不断变动后变成线性的这种情况。