面试官:请说说 B 树与 B+ 树的原理及区别?

点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源!

上一篇:Alibaba开源内网高并发编程手册.pdf

之前在网上看到过一些B树与B+树的区别然后主要是针对定义来陈述,分分钟看的我快要冬眠,然后在一次面试遇到该没问题没回答上来一首凉凉送 给自己,今天老老实实的分享自己对B树,B+树浅显理解,若望指出不足。

B树的原理

动态查找树主要包括:二叉搜索树,平衡二叉树,红黑树,B树,B-树时间复杂度O(log2N),通过对树高度的降低可以提升查找效率

尤其是在大量数据进行存储的时候会存储到外部 磁盘,通过对外部磁盘的读取时需要快速的查找到对应的位置,所以需要一种高效的外部数据结构。

B树:就是为了存储设备或者磁盘设计的一种平衡查找树

辨析1:B树与红黑树的区别

B树的节点可以有很多孩子节点,红黑树是一种近似平衡的二叉搜索树即每个节点只有两个孩子

一颗含有N个节点的B树和红黑树的高度是一样的O(lgn)。

bc44aa90d67a68485e754431e2b8bf83.png
B树的定义

对于一颗M阶的B树

  • 树中的每个节点最多有m个孩子

  • 除了根节点和叶子节点外,其他节点最少含有m/2(取上限)个孩子

  • 若根节点不是叶子节点,则根节点最少含有两个孩子

  • 所以叶子节点都在同一层,叶子节点不包含任何关键字信息

B树的类型与节点定义

struct BTNode
{
 int keyNum ; //实际关键字的个数
 PBTNode parent;//指向父亲节点
 PBTNode *ptr ;
 keyType *key ; //关键字向量
}


B树的插入操作

B树的插入

  • 若B树中已存在需要插入的键值时,用新的键值替换旧值;

  • 若B树中不存在这个值,则在叶子节点进行插入操作;

具体插入过程如下

对于高度为h的m阶B树,新节点一般插在第h层。

  • 若该节点中关键码个数小于m-1,则直接插入

  • 若该节点中关键码个数等于m-1,则节点分裂。以中间的关键码为界,

将节点一分为二,产生一个新的节点,并将中间关键码插入到父节点中。

重复上述过程,最坏情况一直分裂高根节点,则B树就会增加一层。

735d2e4cd0611ce2f6cdfdfcd0b330ca.png


B+树的插入操作

B+树插入

1.若为空树直接插入

2.对于叶子结点: 根据key找到叶子结点,对叶子结点进行插入操作。插入后如果当前叶子结点的key值数b不大于m-1,则插入结束。

反之,将这个叶子结点分成左右两个叶子结点进行操作,左叶子结点包含前m/2个记录,右叶子结点包含剩下的记录key,将第m/2+1个记录的key进位到父结点中,(父结点必须是索引类型的结点)

进位到父结点的key,进位的key左孩子指向左结点,右孩子指向右结点。

3.对于索引结点: 如果当前结点的key个数小于等于m-1,插入结束。

反之,将这个索引类型的结点分成两个索引结点,左索引结点包含前(m-1)/2个数据,右结点包含m-(m-1)/2个数据

将第m/2个key进位到父结点中,进位的key左孩子指向左结点,右孩子指向右结点

剖析2:为什么B+树比B树更适合做系统的数据库索引和文件索引

1)B+树的磁盘读写代价更低

因为B+树内部结点没有指向关键字具体信息的指针,内部结点相对B树小

2)B+树的查询更加稳定

因为非终端结点并不是指向文件内容的结点,仅仅是作为叶子结点的关键字索引,因此所有的关键字查询都会走一条从根节点到叶子结点的路径。即s所有关键字查询的长度是一样的,查询效率稳定。

原文:blog.csdn.net/yu876876/article/details/84896789

-End-

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

3421237c9727d0110222ce47240e3e17.png

正文结束

推荐阅读 ↓↓↓

1.心态崩了!税前2万4,到手1万4,年终奖扣税方式1月1日起施行~

2.深圳一普通中学老师工资单曝光,秒杀程序员,网友:敢问是哪个学校毕业的?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.清华大学:2021 元宇宙研究报告!

6.为什么国内 996 干不过国外的 955呢?

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

eedf16b464e11dd910fe93ac25bd6d73.gif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值