B-Tree 和 B+Tree详解

  • 一、什么是B-Tree
    • 1.B-树插入
    • 2.B-树删除
    • 3.总结
  • 二、什么是B+Tree
    • 1.B+树插入
    • 2.B+树删除
    • 3.总结

一、什么是B-Tree

B-Tree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),OracleMongoDB的索引技术就是基于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+树更充分的利用了节点的空间,让查找速度更加稳定,其速度完全接近于二分查找。

  1. B+树的非叶子节点不对关键字记录的指针进行保存,只进行数据索引,使得B+树非叶子节点能保存关键字的能力大大提升,而且树的层级会更少;
  2. B+树叶子节点保存了其父节点的关键字记录的指针,所以每次查询必须到叶子节点才能真正获取到相关数据,而且平很多叉树的特点是所有子节点的层级相差不会超过一,所以查询速度相对是非常稳定的;
  3. B+Tree树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针;
  4. 非叶子节点的子节点树=关键字数。

1.B+树插入

插入操作全部在叶子节点中进行

  1. 若为空树,创建一个叶子节点,然后将记录插入,同时这个叶子节点也是根节点
  2. 若被插入的关键字所在的节点,其含有的关键字数目小于m,则直接插入
  3. 若被插入关键字所在的节点的关键字数等于m的时候,则需要分裂为两个节点,并将m/2的关键字上移到父节点中,同时判断父节点的关键字个数是否大于m,如果需要分裂继续按照上面的流程进行分裂

2.B+树删除

  1. 如果要删除关键字所在节点的关键字个数,如果大于m/2,直接删除即可;
  2. 当删除关键字所在节点的关键字个数等于m/2的时候,若兄弟节点中含有多余的关键字,也可从兄弟节点中借用关键字完成删除操作;
  3. 若兄弟节点没有多余的关键字,则需要与其他兄弟进行合并;
  4. 如果合并后导致父节点不再符合B+树的结构,则需要按照上面的规律进行再次结构的调整;
  5. 注意B+树的结构(非叶子节点会存储索引信息,叶子节点才会存储数据指针),修改完后还需修改其父节点中的索引值。

3.总结

  1. B+树的层级更少
  2. B+树查询速度更加稳定
  3. B+树天然具备排序功能,由于B+树所有的叶子节点数据构成了一个有序链表,在查询范围区间数据的时候会更加方便,数据紧密性很好高
  4. B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,而B树需要对每一层进行遍历,所以B+树更有利于全表扫描

B-Tree 和 B+Tree详解相关推荐

  1. Android 驱动(12)---Linux DTS(Device Tree Source)设备树详解

    Linux DTS(Device Tree Source)设备树详解 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) Linux DTS(Device Tr ...

  2. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解

    二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...

  3. 高通平台msm8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)

    本系列导航: 高通平台8953  Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) 高通平台8953 Linux DTS(Device Tree Source ...

  4. 高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)

    本系列导航: 高通平台8953  Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) 高通平台8953 Linux DTS(Device Tree Source ...

  5. 第26课:MAT中的Dominator Tree与Retained Set详解

    内容: 1.Dominator Tree与Retained Set         2.Dominator Tree详解 一.Dominator Tree与Retained Set Retained ...

  6. 机器学习——陈天奇Boosted Tree(GBDT)详解

    工作了好多年,从最开始使用xgboost,到后来的lightGBM,它们的底层原理都是Boosted Tree,之前一直没有做过总结,今天我就把陈天奇的Boosted Tree翻译一下,让大家从原理了 ...

  7. 详解Van emde boas tree

    详解Van Emde Boas Tree 在这篇文章中, 我将带大家走进Van Emde Boas tree这种数据结构 Motivation 在读这篇文章之前, 相信大家都已经很了解二叉搜索树了, ...

  8. Eclipse编译运行Native代码步骤详解

    Eclipse编译运行Native代码步骤详解 标签: android jni层   android jni步骤   android jni接口   转自: http://blog.csdn.net/ ...

  9. DTS文件详解,DTS文件解析

    一.什么是DTS?为什么要引入DTS? DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF). 在L ...

  10. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

最新文章

  1. 命令行编译运行CSharp文件
  2. 将 SqlDataReader 类用于快速只进数据游标
  3. topcoder srm 360 div1
  4. html基础代码笔记,HTML基础笔记
  5. NYOJ 14 会场安排问题
  6. 新闻更新延时引发的学习,CACHE的利用。
  7. 利用rsync+inotify搭建实时同步系统
  8. 音乐平台项目的几个问题总结(头像裁剪以及跨页面播放音乐)
  9. Excel比较工具SpreadSheet
  10. #include与#include的区别
  11. Mac上安装Mysql配置文件的添加及修改配置文件
  12. 【多线程经典实例】实现一个线程安全的单例模式
  13. JMeter自动生成测试Report
  14. php实现用户登录、注册以及修改功能(附加源码~)
  15. 360隐私保护器直指腾讯QQ 360真的发飙了,百度旁观!
  16. 联想rd650怎么装系统win7_ThinkServer - RD650 - RAID及系统安装 - 图文
  17. python:matplotlib基础(1)
  18. SystemInfo.deviceUniqueIdentifier
  19. Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
  20. 我的前端知识体系构建(上)

热门文章

  1. 马云等10位大佬心酸往事:9天9夜未睡、装姑娘陪聊、一夜白头…
  2. Fail to execute goa; org.apache.maven.plugins:maven-complier-plugin:3.8.0:compile错误解决方法
  3. Qt 数字格式化,保留三位小数
  4. 微信小程序-开发实战(二)
  5. 法拉第效应维尔德常数_(5)法拉第效应
  6. 超大文件中在有限的内存里找到单词频率 top 100
  7. 当无触控板和鼠标的情况下,如何开启触控板
  8. Science 期刊及其子刊
  9. idea 配置idk
  10. 老卫带你学---全网最强python实现三维散点图(散点,连线,光滑)