B树,B+树,B*树

最近在帮一个学生写B树算法,所有学习了一下,在这里做个笔记。

参考:https://blog.csdn.net/a2311minghan/article/details/89705532

视频讲解:https://www.bilibili.com/video/BV1Aa4y1j7a4?from=search&seid=7972194939195388884

B树

一个m阶的B树具有如下几个特征:B树中所有结点的孩子结点最大值称为B树的阶,通常用m表示。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。

1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 ceil(m/2) ≤ k ≤ m
3.每一个叶子节点都包含k-1个元素,其中 ceil(m/2) ≤ k ≤ m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分
6.每个结点的结构为:(n,A0,K1,A1,K2,A2,…  ,Kn,An)
    其中,Ki(1≤i≤n)为关键字,且Ki<Ki+1(1≤i≤n-1)。
Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。
n为结点中关键字的个数,满足ceil(m/2)-1≤n≤m-1。

插入:

1、 若该结点中关键码个数小于m-1,则直接插入即可。
2、 若该结点中关键码个数等于m-1,则将引起结点的分裂。以中间关键码为界将结点一分为二,产生一个新结点,并把中间关键码插入到父结点(k-1层)中
重复上述工作,最坏情况一直分裂到根结点,建立一个新的根结点,整个B树增加一层。

删除:

B树中关键字的删除比插入更复杂,在这里,只介绍其中的一种方法:

在B树上删除关键字k的过程分两步完成:

   (1)找出该关键字所在的结点。然后根据 k所在结点是否为叶子结点有不同的处理方法。
   (2)若该结点为非叶结点,且被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指的子树中
   找出最小关键字Y,代替key[i]的位置,然后在叶结点中删去Y。

因此,把在非叶结点删除关键字k的问题就变成了删除叶子结点中的关键字的问题了。

在B-树叶结点上删除一个关键字的方法:
首先将要删除的关键字 k直接从该叶子结点中删除。然后根据不同情况分别作相应的处理,共有三种可能情况:

(1)如果被删关键字所在结点的原关键字个数n>=ceil(m/2),说明删去该关键字后该结点仍满足B树的定义。
这种情况最为简单,只需从该结点中直接删去关键字即可。

(2)如果被删关键字所在结点的关键字个数n等于ceil(m/2)-1,说明删去该关键字后该结点将不满足B树的定义,
需要调整。

调整过程为:
   如果其左右兄弟结点中有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的关键字数目大于
ceil(m/2)-1。则可将右(左)兄弟结点中最小(大)关键字上移至双亲结点。而将双亲结点中小(大)于该上
移关键字的关键字下移至被删关键字所在结点中。
   如果左右兄弟结点中没有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的关键字数目均等于
ceil(m/2)-1。这种情况比较复杂。需把要删除关键字的结点与其左(或右)兄弟结点以及双亲结点中分割二者
的关键字合并成一个结点,即在删除关键字后,该结点中剩余的关键字加指针,加上双亲结点中的关键字Ki一起,
合并到Ai(是双亲结点指向该删除关键字结点的左(右)兄弟结点的指针)所指的兄弟结点中去。如果因此使双亲
结点中关键字个数小于ceil(m/2)-1,则对此双亲结点做同样处理。以致于可能直到对根结点做这样的处理而使
整个树减少一层。

总之,设所删关键字为非终端结点中的Ki,则可以指针Ai所指子树中的最小关键字Y代替Ki,然后在相应结点中删除Y。对任意关键字的删除都可以转化为对最下层关键字的删除。

 

B+树

B+树在B树的基础上做了优化,它与B树的差异在于:

(1)有 k 个子节点的节点必然有 k 个key;

(2)非叶子节点仅具有索引作用,跟记录有关的信息均存放在叶子节点中。

(3)树的所有叶子节点构成一个有序链表,可以按照key排序的次序遍历全部记录。

B+树的插入和删除操作原理上和B树类似。

 

B+树相比B树的优势:
1.单一节点存储更多的元素,使得查询的IO次数更少;
2.所有查询都要查找到叶子节点,查询性能稳定;
3.所有叶子节点形成有序链表,便于范围查询。

使用案例:

mongoDb用B树,mysql用B+树

B*树

B*树是B+树的升级版,相同的节点数 ,B*可能比B+更矮。

 

 

 

 

B树是一种多路搜索,它是一种平衡的、自底向上构建的结构。B树又被称为平衡多路搜索,旨在减少存储访问时间。它的特点是每个节点可以包含多个子节点和关键字,并且节点中的关键字按照一定的顺序排列。B树还具有自平衡的特性,即当节点插入或删除后,仍然维持平衡状态。 B树的优点有: 1. 搜索效率高:B树的每个节点包含多个关键字和子节点,这使得在每一层的搜索过程中可以同时查找多个关键字,提高了搜索效率。 2. 存储空间利用率高:B树可以在一个节点中存储多个关键字,相比于二叉搜索,它的存储空间利用率更高。 3. 适合磁盘存储:由于B树节点的大小通常等于磁盘页面的大小,所以B树非常适合在磁盘上存储大量数据。 B*是在B树的基础上进行了优化的一种结构。它在B树的基础上增加了一些特性,使得B*的顺序访问更加高效。B*的特点是: 1. 非叶子节点的关键字数目可以达到M-1,叶子节点的关键字数目可以达到M/2-1,这样可以减少的高度。 2. 非叶子节点只有在关键字范围的最小值和最大值变化时才会更新,不会频繁增删节点。 B*相比于B树的优势在于: 1. 节点的利用率更高:B*中非叶子节点的关键字数目更多,可以更有效地利用节点的空间。 2. 查询效率更高:由于B*的高度比B树更低,所以查询的效率更高。 综上所述,B树和B*都是常用的结构,用来提高数据操作的效率,特别适合存储大量数据的场景,尤其对于磁盘存储更具优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值