B树-分分钟钟被安排地明明白白

B树特性

B树,是一个M叉平衡查询树。如果M为2即为二叉查询平衡树,一般M都是大于2的。其特性如下:

  1. 数据项存储在树的叶子节点。
  2. 所有树的叶子节点都在相同的深度上,并由L/2(小数位进1)和L之间个数据项。
  3. 非叶节点存储直到M-1个关键字以指示搜索的方向;关键字i代表子树i+1中的最小的关键字。
  4. 树的根或者一片树叶节点,其儿子节点数在2和M之间。
  5. 除根外和叶子节点外,其余所有节点的儿子数在M/2(小数位进1)和M之间。

以5叉B树为例,如图:

5阶B树
图-1​​​​

特性1和2:所有的数据节点都在第3层的叶子节点。变量L由物理存储大小和存储的数据大小获得,该树的L为5,每个叶子节点存储的数据项个数为3到5个。

特性3:非叶子节点在该树中,最多最多4个关键字,存储数据项以升序的方式排序。以第2层的非叶子节点为例,第1个关键字8,在第3层子树2个节点中最小的数据8;第2个关键字18,在第3层子树3个节点中最小的数据18。

特点4和特点5:显而易见观察其分支则可知。

b树节点分裂和节点领养

B树数据结构最大的优点就是,降低了树的高度,在执行查询时,减少了查询次数,提高了查询效率。在执行添加或者删除操作时,有可能会破环B树特性。通常,通过节点分裂和节点领养两种方式可以继续保证B树特性。节点分裂会扩展节点的空间,一个饱满的节点分裂为两个节点;节点领养会节省节点空间,使被领养的节点更加饱满。

节点分裂

同层节点分裂

在上述图-1的B树中,添加55时,会添加到节点[54,56,57,58,59],此时,存储数据项个数为6(L+1),大于叶子节点规定的个数。需要把该节点分裂为两个节点,并且修改父节点的信息,总共执行3次操作。操作完成后的B树如图:

图-2

同层级和父级节点分裂

在上述图-2的B树中,添加40时,会添加到节点[35,36,37,38,39],同层节点分裂后,修改父级节点[8,18,26,35],添加关键字40。此时,父级也需要节点分裂,总共执行了5次操作。操作完成后的B树如图:

图-3

 节点领养

在上述的B树中,从节点[97,98,99]删除99,此时,该节点的数据项为2,不满足B树特性,此时临近节点[92,93,95]可以领养97,98数据项。结果,它的父节点的儿子数只有2,不满足B树的特性,其父节点的左节点有四个儿子,需要领养一个使得双方都有3个儿子节点。总共执行了4次操作。操作完成后的B树如图:

图-4