「程序员」程序员小伙这样跟阿里面试官解释B+树,成功收下35k的offer
前言:
上周我通过阿里一面 , 岗位是客户端开发工程师(是的 , 还是java岗!) 。 面试过程中面试官问了B+树 , 回答时面试官一直点头(应该回答得还不错所以过了) , 今天详细讲一讲B+树 。
平衡二叉树 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1 , 并且左右两个子树都是一棵平衡二叉树 。
本文插图
B树(B-树)
本文插图
m阶B树定义 m阶B树是一棵平衡的m路搜索树 , 或者是空树 , 或者是满足以下条件:
- 树中的每个节点最多有m个孩子
- 除了根节点和叶子结点外 , 其他节点最少含有 (m+1)/2 个孩子
- 如果根节点不是叶子结点 , 则根节点最少2个孩子
- 所有叶子节点都在同一层 , 并不带任何信息
- 除了叶子结点 , 节点含有关键字属性 , 数目范围是 [M/2 - 1 , M-1] , 即关键字个数 = 孩子个数 - 1 。
- 关键字:K[1], K[2], …, K[M-1] , 且K[i] < K[i+1] , 即关键字是有序的 。
- 孩子指针:P[1], P[2], …, P[M]
- P[1]指向关键字小于K[1]的子树 , P[M]指向关键字大于K[M-1]的子树 , 其它P[i]指向关键字属于**(K[i-1], K[i])**的子树 。
优点 【「程序员」程序员小伙这样跟阿里面试官解释B+树,成功收下35k的offer】B树相对于B+树的优点是 , 如果经常访问的数据离根节点很近 , 而B树的非叶子节点存储关键字数据的地址 , 所以这种数据检索的时候会要比B+树快 。
B+树
本文插图
m阶B+树定义 B+树是B树的一种变形形式 , m阶B+树满足以下条件:
(1) 每个结点至多有m个孩子 。
(2) 除根节点和叶结点外 , 每个结点至少有(m+1)/2个孩子 。
(3) 如果根节点不为空 , 根结点至少有两个孩子 。
(4) 所有叶子结点增加一个链指针 , 所有关键字都在叶子结点出现 。
(5) 除了叶节点 , 结点的孩子数目等于关键字数目 。注意 , B+树中非叶子结点存储的不是关键字数据的地址 , 而是指向叶子结点中关键字的索引 。 (所以任何关键字的查找必须走一条从根结点到叶子结点的路)
非叶子结点的子树指针P[i] , 指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)
优点
- B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多 , 树的层级更少所以查询数据更快;
- B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上 , 所以每次查找的次数都相同所以查询速度要比B树更稳定;
- B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表 , 在查询大小区间的数据时候更方便 , 数据紧密性很高 , 缓存的命中率也会比B树高 。
- B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可 , 而不需要像B树一样需要对每一层进行遍历 , 这有利于数据库做全表扫描 。
结点的分裂:
- 将已满结点进行分裂 , 将已满节点后M/2节点生成一个新节点 , 将新节点的第一个元素指向父节点 。
- 父节点出现已满 , 将父节点继续分裂 。
- 一直分裂 , 如果根节点已满 , 则需要分类根节点 , 此时树的高度增加 。
- 斯利廷|魅族16th沦为百元机?小伙二手市场淘到宝,拿来备用很不错
- 生活小蒙娜|小伙花5000块买了部手机为啥用一个月就后悔了?来听听小伙咋说
- 佛山林创|4G信号变差了?跟我这样设置,让你的信号瞬间满格
- 太平洋电脑网|高颜值和背板加持,这样的ITX显卡谁不爱
- 刘小兔的评测小屋|小米有品充气颈枕卖到300块?小伙入手一个做了勇士才明白为什么
- 互联网观察家|荣耀30系列定格十二星座惊艳画面!这样的神仙手机,你爱不爱?
- 太平洋电脑网|汽车发动机热效率为什么做不到 100%?奇瑞这样科普
- cnBeta|如果设备被阻止接收功能更新 微软Windows 10将这样提示用户
- RNN|看完发现RNN原来是这样,机器学习人门贴送上
- 毒眼观察|卢伟冰这样解释性价比之王!网友:鬼才
