B树(B-树) [数据结构与算法][Java]

B树

B树又称为多路平衡树查找树, 是一种组织和维护外存文件系统非常有效的数据结构
因为我们的二分搜索树构建的时候很可能会出现不平衡的情况, 所以我们提出了自平衡二分搜索树(AVL树)对我们的普通的二分搜索树进行了一个优化, 而自平衡二分搜索树中当元素很多的时候树的高度也会很高, 当我们的二分搜索树用于数据库检索的时候效率也会很低, 因为树的高度就决定了我们用于数据库检索的时候要发生的I/O次数, 所以我们用于数据库检索的树一定是要高度比较低的, 因为我们的和磁盘IO是很费时间的, 也就是对效率影响是很大的 —> 所以我们又提出了多路平衡查找树, 能很好的解决这一问题
  • 所以我们的B树就是用来减少磁盘IO次数的, 因为当我们的数据特别多的时候, 当数据量达到亿级别之后, 我们的主存中可能就存放不下了, 这个时候我们要将数据以块的形式存储到磁盘中, 这个时候我们要去磁盘上查找数据就会涉及到和磁盘之间的IO, 而我们知道和磁盘之间的IO不像直接访问主存(内存)中的数据, 如果是内存中的数据我们很快就可以访问到, 但是如果是外存(磁盘)中的数据, 我们要访问的时候就会涉及内存和磁盘的IO, 因为我们要先将数据从磁盘(外存)中读取到内存中来, 这个过程是很耗费时间的
    • 如果我们使用二分搜索树作为检索磁盘数据的底层结构, 那么我们需要检索的平均IO次数就在O(log n) 到O(n)之间
      • 如果是一个满二叉树的时候, 这个时候树的高度就是以2为底n的对数(n就是结点个数), 而树的高度其实就是决定了我们查找的效率, 而如果是一个满二叉树的时候查找的效率是最高的, 也就是O(n), 但是如果这个数是完全倾斜的, 这个时候最终就会严重不平衡, 类似于一个链表, 这个时候查找的时间复杂度就是O(n)
    • 如果我们使用自平衡二叉树作为检索磁盘数据的底层结构, 那么我们需要检索的平均IO次数为O(log n)
    • 如果我们使用的是多路平衡搜索树作为检索磁盘数据的底层结构, 那么我们需要检索的平均IO次数会低于O(log n), 我们可以通过设置多路平衡搜索树的阶数来控制IO次数, 甚至1024阶的多路平衡搜索树在600亿数据中检索只需要四次磁盘IO(也就是树高为4)
      • 因为我们的检索磁盘数据的IO次数就和底层树结构的高度有关, 我们的二分搜索树的树高为O(log n) - O(n), 自平衡二叉树的树高度为O(log n) , 多路平衡搜索树的树高度可以通过设置不同的阶数来改变, 但是肯定是低于O(log n)的
B树就是一个多路平衡搜索树
  • B树中要求任何一个节点的BF都要等于0
    • BF : 平衡因子

这里我们以一个实例来了解B树(如下图就是一个三阶B树):

在这里插入图片描述

一颗m阶B树要么是一颗空树, 要么是满足下列要求的m叉树:

  1. 树中每个结点至多有m个孩子结点
    • 至多有m个孩子结点, 那么也就是至多有m-1个关键字
  2. 处根节点外, 其他非叶子结点至少有Math.celi(m / 2)个孩子结点
    • 除根节点以外, 所有结点(包括非叶子结点和叶子结点), 每个结点至少有Math.celi(m / 2) - 1个关键字
对于B树而言: 一个节点的关键字数总是被限制在某个范围之内:
  • 根节点: 1个关键字到m个关键字
  • 非根节点: Math.celi(m / 2) - 1个关键字到m-1个关键字
而确定了关键字个数之后对应节点的子节点个数就更加好确定了, 我们的子节点个数要么为0, 要么为当前节点的关键字个数 + 1
  1. 若根节点不是叶子结点, 则根节点至少有两个孩子结点

  2. 每个结点的结构如下(结点中按关键字(数据项)的大小顺序排列):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMEpUByG-1671859765528)(E:\非凡英才\数据结构(java)]\数据结构图解\B树中每个结点的结构.png)

  • 我们可以发现指针总是比关键字多一个, 因为我们的关键字的两边都要是指针, 这也就是为什么我们的结点中的子节点个数总是比关键字个数多一个了
    • 因为我们的指针(索引)也就是指向我们的子节点的
  • 我们的指针(索引)是从P0开始的, 而关键字则是从K1开始的, 最终是通过Kn后面一个Pn结束的
  1. 所有外部结点都在同一层中(也就是所有的叶子结点都在同一层)
  2. B树是所有结点的平衡因子均等于0的多路平衡树
注意: 在计算B树高度时, 需要计入最底层的外部结点
说明: 在B树中, 外部结点就是失败结点, 指向它的指针为空, 不含有任何信息, 外部结点是虚设的
一颗B树中有n个关键字, 则外部结点的个数为n + 1
2 - 3树是最简单的B树, 2 - 3树就是三阶B树

补充:

没有B-树, 所谓的B-树就是B树, 只有B树, B+(加)树, B*(星)树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值