B树&B+树

B树

Def.

Branches/Balance?,多路平衡查找树

二叉查找树 → m叉查找树

image-20210629202352482

如何保证查找效率?

  • 限制最小分叉数(除开根结点)

image-20210629203010379

  • 限制任何一个结点的子树高度都要相同

image-20210629203307796

如果m叉查找树满足以上两点限制,它就是一棵B树

image-20210629204632300

image-20210629205157563

正如其名,着重关注两点特性:多路(m叉,注意上下限),平衡(子树高度一致)

核心特性归纳

image-20210629205449223

B树的高度

最小高度

image-20210629211341595

注意结点关键字的区别!

  • 一个结点最多可以放 m-1 个关键字
  • 根结点有且仅有一个(视作第0层),依次向下第1层最多有 m 个结点,第二层 m^2 , ... ,以此类推可得上图不等式
image-20210629203010379

最大高度

  • 从叶子节点个数入手

image-20210629213546030

  • 或者从关键字的个数入手:

image-20210629214107722

求出的最大高度结果一致

小结

image-20210629214313080

B树的插入和删除

插入

插入位置一定是最低层的非叶节点(叶子结点就是失败结点)

否则会出现下图的错误情况:(将90插到了上层结点中 → 破坏B树特性

image-20210630105019654

对于m阶B树,当插入后的关键字个数大于m-1时,需要对结点进行分裂

image-20210630110114768

分裂后的结构如下:

image-20210630152730992

注意到分裂操作会使父结点容纳的关键字加一,因此可能会导致父结点也“装满”了,这时就需要继续对父结点进行

分裂...

image-20210630153022729

总结:B树的插入分为两步:①定位插入

image-20210630152407750

删除

image-20210630153650120

  • 对终端结点可以直接删除(注意维持结点内对关键字个数的限制

  • 对非终端结点的删除操作必然可以转化为对终端结点的删除操作(找直接前驱和直接后继):

    image-20210630153915896

现在讨论删除后结点内关键字不够(低于下限)的情况:

“删除38”

image-20210630154249886

删除之后25所在结点不满足B树性质(2≤n≤4),因此需要向旁边的兄弟

image-20210630154745654

“删除90”

image-20210630155054372

image-20210630155146536

“继续删除49”

image-20210630155323994

可是它的兄弟也不富裕了,这时就需要进行合并操作:

image-20210630155547641

问题还没有结束,合并操作使得父结点的关键字又少了一个,导致父结点的关键字个数不够,因此需要继续合并

image-20210630155844126

最后的B树结构如下:

image-20210630160002415

核心要求其实就两点:

  • 结点内对关键字个数的限制
  • 子树0<关键字1<子树1<关键字2 ...

image-20210630160051790

B+树

B+树结合了B树分块查找的思想:

image-20210630162910665

Def.

下面给出B+树的定义:

image-20210630163338323

B+树的查找

  • **Attempt_1: 从根开始的多路查找: **

image-20210630163935181

image-20210630164014008

**Attempt_2: 也可以从指针p开始,即从最小关键字开始的顺序查找: **

image-20210630164208557

小结

image-20210630165539464

posted @ 2021-06-30 16:57  盐盐盐の锅  阅读(61)  评论(0编辑  收藏  举报