锁屏面试题百日百刷-java大厂八股文(day1)

为了更好的准备面试,刷题方式正式改版,每日从各处收集的面经中选择几道经典面试题分享并给出答案供参考,答案中会做与题目相关的扩展,并且可能会抛出一定问题供思考。这些题目我会标注具体的公司、招聘类型(校招、社招、实习)以及面试阶段。这些面试题会收录到锁屏面试题app和小程序中并整理归类好。其他面试题也同样在持续更新中,多谢使用和支持。下面是今日面试题:

====b树和b+树的区别?[shopee][校招][一面]

(一)b树:======================================================

b树的定义

b树就是b-树(b-tree),b树是一种平衡多路查找树,它在文件系统中很有用。

具有以下规则的树是b树(M阶树):

(1)首先强调的一点是b树的阶是由人为定义的,只有当对一个b树没有明确指定多少阶的时候,直接问你这个b树的阶数,才可以通过一个b树的所有节点的最多分支数来说这个b树是多少阶的。如下图中,若没有说明是几阶,我们可以看到w所在的节点的分支数最多,为5,则可以说这是个5阶b树。

(2)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;

(3)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外;

(4)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2),这个是b树插入和删除操作时关键依据。

(5)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null。

锁屏面试题百日百刷-java大厂八股文(day1)_第1张图片

b树的查询:

比如查找F:

  1. 从根节点开始,F
  2. 得到关键字D和G,D
  3. 最终找到F

b树的其他操作由于篇幅的问题,以及与题目关系不大,不做表述,感兴趣的可以到网上查找资料了解下。

(二)b+树:======================================================

b+树的定义:

b+树与b基本相同,主要有以下区别(树的阶数为M):

  1. b+树中具有n个关键字的的节点含有n个分支,而b树中具有n个关键字的的节点含有n+1个分支
  2. B+树中非根节点的关键字数n取值范围为ceil(M/2)≤n≤M,根节点的关键字数n取值范围为2≤n≤M,而b树中这两个取值范围分别为ceil(M/2)-1≤n≤M-1和2-1≤n≤M-1
  3. b+树中非叶子节点中仅仅起到索引作用,即节点中索引只包含对应子树最大关键字和指向子树的指针,不包含关键字对应记录的存储地址。而b树中每个关键字包含对应的存储地址。
  4. b+树中叶子节点包含信息,叶子节点包含所有关键字,关键字包含对应的存储地址信息。
  5. b+树中有一个指针指向叶子节点中最小的关键字所在的节点(如下图中P),所有的叶子节点链接成一个线性链表,二b树没有

锁屏面试题百日百刷-java大厂八股文(day1)_第2张图片

从这些区别中可引申出一个问题,mysql中为什么使用b+树,而不使用b树: 

1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;

2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;

3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。

4、B+树全节点遍历更快(全表扫描):B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

更多面试题或学习资源可查看我主页或评论获取

你可能感兴趣的:(大厂面试题,java,面试,数据结构)