B+树&B*树简介

一、B+树
B+树是B树的变体,也是一种多路搜索树,它的定义如下:
1、根节点要么是叶子结点,要么至少具有两个孩子
2、一棵M路的B树M至少大于2,每个非根结点的孩子的个数有[M/2,M]
3、所有叶子结点都在同一层
4、非根结点的子树指针与关键字的个数是相等的,也就是说孩子的个数与关键字的个数是相等的。
5、为所有孩子结点都增加了一个链指针,可以按照关键码排序的次序遍历全部记录。
6、非根结点仅具有索引作用,根记录有关的信息均存放在叶子结点中,所有的关键字都在叶子结点中出现,
7、非叶子结点的子树指针p[i],指向的关键字在[K[i],K[i+1])之间。
B树和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点之间用链表链接,便于区间查找和遍历。
8、通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
9、在B+树中由于非叶子结点(内部结点)之存储索引,而叶子节点(外部结点)才存储数据,因此B+树中的内部结点和外部结点的大小一般是不同的。
《B+树&B*树简介》

B+树的分裂:
  当一个结点满时,分配一个新的结点,并将原结点中的1/2的数据复制到新节点中,最后再父节点中增加指向新节点的指针;B+树的分裂只影响原节点和父节点,而不会影响兄弟结点,所以他不需要指向兄弟结点的指针。


B+树的优点:   
  由于B+树内部的结点上不存储数据信息,因此在内存中能够存放更多的key,数据存放的更加紧密,具有更好的空间局部性。因此访问叶子结点上关联的数据也具有更好的缓存命中率。
B+树的叶子结点都是相连的,因此对于整棵树的遍历只需要一次线性遍历叶子节点即可,而且它的数据还是顺序排列的,所以便于查找和搜索。而B树则需要进行每一层的递归遍历,相邻的元素可能在内存中不相邻,所以缓存命中率没有B+树好。


B树的优点:
由于B树是Key_Value形式的,假如你经常访问的元素离根节点很近,则B树的访问效率更高。

二、B*树
  B*树是B+树的变体,在B树的非根和非叶子结点再增加指向兄弟的指针,这样做 的目的是为了便于插入和删除。
  B*树定义了非叶子节点的关键字的个数至少为(2/3)*M,即结点的最低使用效率为2/3。
《B+树&B*树简介》



B*树的分裂:
 当一个结点满了的时候,如果他的下一个兄弟结点没满,则就将一部分数据转移到兄弟结点中,再在原节点插入关键字,最后修改父节点中兄弟结点的关键字即可;如果兄弟结点也满了,则在原节点与兄弟结点之间新增一个结点,并各复制1/3的数据到新节点,最后再父节点中增加新节点的指针。

三、B*树与B+树的比较
 B*树分配新节点的概率比B+树要低,因为
B*树中,当一个结点满了之后并不是直接就创建新的结点,而是先去判断兄弟结点满了没有,如果兄弟结点没有满,则就向兄弟结点中转移数据,否则的话才去分配新的结点,所以B*树的空间利用率比B+树要高,因为他更倾向于让每个结点更加饱满。


四、B树、B+树通常作为数据库的搜索引擎

    原文作者:B树
    原文地址: https://blog.csdn.net/lf_2016/article/details/53366096
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞