B-Tree 和 B+Tree详解
B-Tree 和 B+Tree详解
- 一、什么是B-Tree
- 1.B-树插入
- 2.B-树删除
- 3.总结
- 二、什么是B+Tree
- 1.B+树插入
- 2.B+树删除
- 3.总结
一、什么是B-Tree
B-Tree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongoDB的索引技术就是基于B树的数据结构,B树也可以看作是对查找树的一种扩展。
一个m阶的B-Tree有以下性质:
- 每个节点最多有m个子节点
- 每个非叶子节点(根节点除外)至少含有m/2个子节点
- 如果根节点不是叶子节点,那么根节点至少有两个子节点
- 每个节点上,所有的关键字都是有序的,从左到右,依次从小到大排序
- 每个关键字的左子树的均值小于当前关键字,右子树的均值大于当前关键字
- 每个节点都存有索引和数据
- 对于一个非叶子节点而言,它最多能存储m-1个关键字
- 所有叶子节点位于同一层
1.B-树插入
对于一个m阶B树,新节点一般是插在叶子层,但是需要根据实际的情况考虑是否需要裂变。
- 若该节点中关键码个数小于m-1,则直接插入
- 若该节点中关键字个数等于m-1,则将进行分裂,以中间关键字为界点将节点一分为2,产生一个新的节点,并把中间那个关键字插入到父节点中,继续判断父节点的关键字个数是否等于m-1,依次判断是否分裂,最坏情况下可一直分裂到根节点,整个树增加一层。
2.B-树删除
B树的删除也非常复杂
- 如果关键字所在节点的原关键树>=(m/2),说明删除后仍可满足B树的结构,可以直接pass掉。
- 如果被删除后不再满足B树的结构,则需要一定的调整过程
- 如果其左右节点中有多余的关键字,即与该节点相邻的节点中关键字的数目大于(m/2)-1,就会将节点中的最大(左)或者最小(右)移到夫节点上,然后将双方节点中小于(右节点上移)或者大于(左节点上移)关键字的关键字下移到被删关键字的节点中。
- 如果其左右都没有多余关键字的时候,情况将变得非常非常复杂;需把删除关键字节点与其左(或者右)节点中的关键字合并到(父节点指向该删除关键字节点的左(右)节点的指针)所指向的左右节点中去,如果因此父节点中的关键字个数小于规定值,则需要对父节点做同样的处理,最坏情况下会使得整个树减少一层。
3.总结
B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘块大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了很多,大大减少了数据查找和比较的次数,提高了效率。
二、什么是B+Tree
B+Tree中如果有N个关键字则会拥有n个分支,而B树中n个关键字的节点包含n+1个分支。
B+Tree中,每个非根节点中的关键字个数是>=( m / 2 )且 < =m,而B树是 >=(m / 2)-1且< = (m-1)。
B+Tree中根节点的关键字个数是>=1且<=m,而B树是>=1且<=(m-1)。
B+树是B树的一个升级版,因为B+Tree非叶子节点不存储关键字记录的指针,所以其相对于B树来说B+树更充分的利用了节点的空间,让查找速度更加稳定,其速度完全接近于二分查找。
- B+树的非叶子节点不对关键字记录的指针进行保存,只进行数据索引,使得B+树非叶子节点能保存关键字的能力大大提升,而且树的层级会更少;
- B+树叶子节点保存了其父节点的关键字记录的指针,所以每次查询必须到叶子节点才能真正获取到相关数据,而且平很多叉树的特点是所有子节点的层级相差不会超过一,所以查询速度相对是非常稳定的;
- B+Tree树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针;
- 非叶子节点的子节点树=关键字数。
1.B+树插入
插入操作全部在叶子节点中进行
- 若为空树,创建一个叶子节点,然后将记录插入,同时这个叶子节点也是根节点
- 若被插入的关键字所在的节点,其含有的关键字数目小于m,则直接插入
- 若被插入关键字所在的节点的关键字数等于m的时候,则需要分裂为两个节点,并将m/2的关键字上移到父节点中,同时判断父节点的关键字个数是否大于m,如果需要分裂继续按照上面的流程进行分裂
2.B+树删除
- 如果要删除关键字所在节点的关键字个数,如果大于m/2,直接删除即可;
- 当删除关键字所在节点的关键字个数等于m/2的时候,若兄弟节点中含有多余的关键字,也可从兄弟节点中借用关键字完成删除操作;
- 若兄弟节点没有多余的关键字,则需要与其他兄弟进行合并;
- 如果合并后导致父节点不再符合B+树的结构,则需要按照上面的规律进行再次结构的调整;
- 注意B+树的结构(非叶子节点会存储索引信息,叶子节点才会存储数据指针),修改完后还需修改其父节点中的索引值。
3.总结
- B+树的层级更少
- B+树查询速度更加稳定
- B+树天然具备排序功能,由于B+树所有的叶子节点数据构成了一个有序链表,在查询范围区间数据的时候会更加方便,数据紧密性很好高
- B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,而B树需要对每一层进行遍历,所以B+树更有利于全表扫描
B-Tree 和 B+Tree详解相关推荐
- Android 驱动(12)---Linux DTS(Device Tree Source)设备树详解
Linux DTS(Device Tree Source)设备树详解 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) Linux DTS(Device Tr ...
- 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解
二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...
- 高通平台msm8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)
本系列导航: 高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) 高通平台8953 Linux DTS(Device Tree Source ...
- 高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)
本系列导航: 高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) 高通平台8953 Linux DTS(Device Tree Source ...
- 第26课:MAT中的Dominator Tree与Retained Set详解
内容: 1.Dominator Tree与Retained Set 2.Dominator Tree详解 一.Dominator Tree与Retained Set Retained ...
- 机器学习——陈天奇Boosted Tree(GBDT)详解
工作了好多年,从最开始使用xgboost,到后来的lightGBM,它们的底层原理都是Boosted Tree,之前一直没有做过总结,今天我就把陈天奇的Boosted Tree翻译一下,让大家从原理了 ...
- 详解Van emde boas tree
详解Van Emde Boas Tree 在这篇文章中, 我将带大家走进Van Emde Boas tree这种数据结构 Motivation 在读这篇文章之前, 相信大家都已经很了解二叉搜索树了, ...
- Eclipse编译运行Native代码步骤详解
Eclipse编译运行Native代码步骤详解 标签: android jni层 android jni步骤 android jni接口 转自: http://blog.csdn.net/ ...
- DTS文件详解,DTS文件解析
一.什么是DTS?为什么要引入DTS? DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF). 在L ...
- Ext.Net学习笔记22:Ext.Net Tree 用法详解
上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...
最新文章
- 命令行编译运行CSharp文件
- 将 SqlDataReader 类用于快速只进数据游标
- topcoder srm 360 div1
- html基础代码笔记,HTML基础笔记
- NYOJ 14 会场安排问题
- 新闻更新延时引发的学习,CACHE的利用。
- 利用rsync+inotify搭建实时同步系统
- 音乐平台项目的几个问题总结(头像裁剪以及跨页面播放音乐)
- Excel比较工具SpreadSheet
- #include与#include的区别
- Mac上安装Mysql配置文件的添加及修改配置文件
- 【多线程经典实例】实现一个线程安全的单例模式
- JMeter自动生成测试Report
- php实现用户登录、注册以及修改功能(附加源码~)
- 360隐私保护器直指腾讯QQ 360真的发飙了,百度旁观!
- 联想rd650怎么装系统win7_ThinkServer - RD650 - RAID及系统安装 - 图文
- python:matplotlib基础(1)
- SystemInfo.deviceUniqueIdentifier
- Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
- 我的前端知识体系构建(上)
热门文章
- 马云等10位大佬心酸往事:9天9夜未睡、装姑娘陪聊、一夜白头…
- Fail to execute goa; org.apache.maven.plugins:maven-complier-plugin:3.8.0:compile错误解决方法
- Qt 数字格式化,保留三位小数
- 微信小程序-开发实战(二)
- 法拉第效应维尔德常数_(5)法拉第效应
- 超大文件中在有限的内存里找到单词频率 top 100
- 当无触控板和鼠标的情况下,如何开启触控板
- Science 期刊及其子刊
- idea 配置idk
- 老卫带你学---全网最强python实现三维散点图(散点,连线,光滑)