学习B树与B+树,B*树.
参考地址:这,这,这,这里
B树即B-树.B表平衡的意思.B树必须中序遍历
,B+树,则叶子扫一遍即可.B+树支持区间查询
.
*号,要放在反引号里面
定义:
有个阶数,即最大子节点数m. 关键字,从小到大排列.每个节点,存储键和值. 叶子节点,位于同一层. 每个关键字的左子树的关键字都小于自己,而右子树的关键字都大于自己.这一条所有的树都应该这样,为了二分法快速查找. 根节点子节点数为[2,m].其余为[m/2,m]节点数 节点,至少有(m-1)/2个关键字,至多m-1个.根节点至少1个关键字(2个子节点).注意这是关键字.m是最大子节点数. 注意区别关键字与子节点数.关键字=子节点数-1.
B树插入:
如果,关键字<m-1,则插入,为m-1,则插入后分裂.分成两个子树加上自己. 即2*(m-1)/2+1. 多叉树与二叉树的优势是树高小.因而查询快. B+树从叶子节点,一扫就完了. 成功查询,B树好.B树比B+树矮.B+树,始终都要走从根到节点的距离. 而B树,则有可能从在中间,因为非叶子节点也含值.而B+树非叶子节点不含值. B+树,对于平均频率查询,倒是比较好. B树,对频率会变的查询,是可以的.内存中B+树无优势,但磁盘中,优势就出来了. B-树,就是B树.没有什么B-(减)树.B树就是B-树.-是单词连接符.不是减号. B*树,就是至少有2/3*m个节点.[2m/3,m].B*树空间利用率更高.分裂更少. B树与二叉树的区别是B树一个节点可存储多个关键字.在此比较.
其实,整个B树与B+树,B*树,所有二叉树,所有树,都是在实数上的
.
他们的调整就是调整附近位置.再满足他们自己的限定条件.他们的位置无论如何调整,始终都是垂直不变的. 看起来调整了,不过是上下级的变化.他们的根本位置是不变的.因为他们都是实数上数值.根本就没变.
区间查询(数据库有用):查询5~10
这个区间.B+树左边一个点,右边一个点,一把索.B树成功查询方便,因为节点短.
B+树的子节点(叶位置)都是连在一起的.所以可以一把索.相当于每个叶子的值都是手拉手的在实数上排列着的.
B树B+树的上层,其实因为经常查找,所以,都在内存缓冲着的.
B*
树,在非根与非叶子节点处,再加上指向兄弟的指针.这样,兄弟也链接上了.即非叶子节点也相互手拉手了.
B*
树,非叶子节点,>2m/3.
B+的+就是叶子结点是连着的.
B+树分裂:
分配新结点,复制原结点一半数据过去,父结点增加新结点指针,只影响父,新结点,不影响兄弟结点
B*
数分裂:
先看兄弟结点,如未满,则一部分至兄弟结点,调整兄弟节点,再调整自己节点. 如满了,在原结点与兄弟结点中加新结点,各复制1/3数据过去,在父节点中增加新节点指针.
需要兄弟结点,所以,要有兄弟结点的链接指针,因而*就是叶子节点加上兄弟结点的意思.
也有基于频率
的B树
.
二叉树比二分查找的优点是:改变结构时,只需要常数开销.
,即方便增删.
平衡算法,保持插入后,树仍然是平衡
的.
B树的节点与关键字的关系是:节点 关键字 节点 关键字 节点...
的关系.
子节点,可能为空.即无内容的节点.
B树性能等价于二分查找
.节点满时分裂成2个子节点,删结点时,不足时,要合并节点.
B*
树,和另外一个节点,满足2/3时,分节点,不足时,合并结点.
B+树.从根部的节点的关键字,最终都压扁下放到叶子节点.
,B+树就是非叶子结点,只起一个判定作用.叶子节点一层才是所有数据,从头到尾装满了实数线.更适用于文件索引
.
B*树,B树再加上兄弟节点的指针,主要是为了更节省空间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现