04树 + 堆 + 优先队列 + 图(D1_树(D8_B*树(B*)))

目录

一、基本介绍

二、相同思想和策略

三、不同的方式的磁盘空间利用

四、知识小结


一、基本介绍

B*树是B+tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有

些关键字记录的指针),

  • B*树中非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3) * M,即块的最低使用率为2/3(代替B+树的1/2),B*树分配新结点的概率比B+树要低,空间使用率更高。
  • B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;

04树 + 堆 + 优先队列 + 图(D1_树(D8_B*树(B*)))_第1张图片

二、相同思想和策略

从平衡二叉树、B树、B+树、B*树总体来看它们的贯彻的思想是相同的,都是采用二分法和数据平

衡策略来提升查找数据的速度;

三、不同的方式的磁盘空间利用

不同点是他们一个一个在演变的过程中通过IO从磁盘读取数据的原理进行一步步的演变,每一次演

变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的;

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后

在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以

它不需要指向兄弟的指针。

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点

中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改

变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结

点,最后在父结点增加新结点的指针。

所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

四、知识小结

通过以上介绍,大致将B树,B+树,B*树总结如下:

  • B树:有序数组+平衡多叉树;
  • B+树:有序数组链表+平衡多叉树;
  • B*树:一棵丰满的B+树。

顺便说一句,无论是B树,还是B+树、b树,由于根或者树的上面几层被反复查询,所以这几块可

以存在内存中,换言之,B树、B+树、B树的根结点和部分顶层数据在内存中,大部分下层数据在

磁盘上。

你可能感兴趣的:(06数据结构与算法,数据结构,算法)