B树(B-Tree)
B树(B-Tree)是一种自平衡的搜索树,又称平衡多路查找树,主要用于系统中大量数据的读和写操作。B树的特点是能保持数据有序,这使得在B树中进行查找、顺序访问、插入和删除等操作都非常高效。
B树中单一节点拥有的最多子结点的数量称为B树的阶,一个m阶B树的主要特点如下:
- 所有叶子节点都在同一层
- 每个节点中的元素都按照升序排列,每个元素的左子树中的所有关键字都小于它,右子树中所有元素都大于它
- 若根节点不是叶子节点,则至少有两颗子树(2<=子树个数<=m)
- 除根结点和叶子节点外,节点至少有
ceil(m/2)
棵子树- 有k个孩子的非叶子节点包含k-1个元素(ceil(m/2)<=k<=m,当m=3时,2<=k<=3)
在B树中,插入和删除操作可能涉及节点的分裂和合并,以保持树的平衡性。当插入数据时,如果节点已满,会触发节点的分裂操作;当删除数据时,如果节点过于空闲,会触发节点的合并操作。
B树的查询操作
上图是一个三阶的B树,如果我们要查找元素5,需要进行如下步骤
- 与根节点元素9进行比较,5<9进入左子树
- 与左子树元素2和6进行比较,发现2<5<6,进入中间子树
- 与中间子树3和5进行比较,找到5
B树的几种插入删除情况
- 如果插入10,没有打破规则,直接插入
- 如果插入4,这时候可以看到叶子节点元素过多,超过了m-1,因此需要对节点进行分裂
- 将ceil(m/2)位置的元素上升到父结点
- 此时父结点的元素个数同样不满足B树规则,因此继续对父结点进行分裂
- 删除元素13,没有改变规则
- 删除元素8,剩余元素不足,相邻的兄弟节点没有多余元素,这时候就需要与相邻兄弟节点进行合并操作
- 首先移动父结点中的元素【该元素在两个需要合并的两个结点元素之间】下移到其子结点中,然后将这两个结点进行合并成一个结点
- 删除元素11,剩余元素不足,相邻兄弟节点有多余元素
- 删除后,父节点(9,12)就少一个子节点。此时可以向兄弟节点“借”一个元素。但6不可以直接放在元素11的位置,需要上升到到父节点中,再把元素6和12之间的元素9移动到元素11的位置
- 删除2
- 删除元素6
- 使用9替代6,删除9之后相邻兄弟没有多余元素,需要从父结点去借一个元素,然后进行合并
B+树
是B树的一种变体,主要用于数据库和文件系统,
B+树的主要特点
- 有k个子树的中间节点包含k个元素(B树是k-1),每个元素不保存数据,数据都保存在叶子节点。
- 所有的叶子节点包含了全部元素,依照元素的大小升序排列,叶子节点之间用双向指针链接
- 所有中间节点的元素都同时存在于子结点,在子结点元素中是最大或最小元素
- B+树叶子节点中元素个数为
(ceil(m/2)~m)
,添加第一个节点除外
在上图的B+树中,根节点元素8在子节点(2,5,8)中是最大元素,也是叶子节点(6,8)的最大元素;根节点元素15在子节点(11,15)中是最大元素,在叶子结点(13,15)中也是最大元素。
B+树的好处
方便进行范围查询,比如我要查询3~11区间的元素
- 首先自顶向下,查找区间的最小值3所在的叶子结点
- 通过链表指针,遍历到相邻叶子节点(6,8)
- 继续通过链表指针,遍历到相邻叶子结点(9,11)
插入操作
情况1. 若被插入元素所在的结点,其含有元素数目小于阶数 m,则直接插入
情况2. 若被插入关键字所在的结点,其含有关键字数目等于阶数 m,则需要将该结点分裂为两个结点,一个结点包含 ⌈m/2⌉ 。同时,将⌈m/2⌉的关键字上移至其双亲结点。假设其双亲结点中包含的关键字个数小于 m,则插入操作完成
情况3. 若插入的关键字比当前结点中的最大值还大,破坏了B+树中从根结点到当前结点的所有索引值,此时需要及时修正后,再做其他操作。
情况4. 在第 2 情况中,如果上移操作导致其双亲结点中关键字个数大于 m,则应继续分裂其双亲结点。插入元素20
删除操作
情况1:找到存储有该关键字所在的结点时,由于该结点中关键字个数大于⌈M/2⌉,做删除操作不会破坏 B+树,则可以直接删除。
情况2: 当删除该关键字时,导致当前结点中关键字个数小于 ⌈M/2⌉,若其兄弟结点中含有多余的关键字,可以从兄弟结点中借关键字完成删除操作。
情况3: 情况2中,如果其兄弟结点没有多余的关键字,则需要同其兄弟结点进行合并。
情况4: 当删除某结点中最大的关键字时,就会涉及到更改其双亲结点一直到根结点中所有索引值的更改。
情况5: 当进行合并时,可能会产生因合并使其双亲结点破坏 B+树的结构,需要依照以上规律处理其双亲结点。文章来源:https://www.toymoban.com/news/detail-532966.html
文章来源地址https://www.toymoban.com/news/detail-532966.html
到了这里,关于计算机基础--->数据结构(8)【B树、B+树<超详细图文>】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!