什么是B-树?

什么是B-树呢?B-树全名 Balance Tree,读做B树(中间的-,只是分隔作用,不要读做B减树哦)。

B树的特征

B树首先它也是属于树结构,除了树结构的节点有序、查找高效外,还有以下特性。以一个m阶的B树来举栗:

  1. 根节点至少包含两个子节点;
  2. 每个中间节点包括k-1个元素和k个子节点,其中m/2 <= k <= m
  3. 每一个叶子节点包含k-1个元素,其中m/2 <= k <= m
  4. 每个节点的元素从大到小有序,节点当中k-1个元素是k个子节点的值域的划分。

纯概念不好理解,来张图描述。这里使用的是3阶B树为例:

什么是B-树?_第1张图片

节点【2,6】就满足以上说的特征,它有两个元素,分别是2和6,有三个子节点:1、3和5、8。节点1是小于值2,节点3和5是介于值2和6,节点8是大于值6

什么是B-树?_第2张图片

B树的查找

如果需要查询一个元素,改如何实现呢?假如要查询的值是5

什么是B-树?_第3张图片
什么是B-树?_第4张图片
什么是B-树?_第5张图片 什么是B-树?_第6张图片 什么是B-树?_第7张图片
什么是B-树?_第8张图片
  从图中可以看出,B树查找的次数不比二叉查找树要少,特别是当某个节点内元素较多的时候,比较次数更多,但是,比较操作是在内存中进行的,所以损耗可以忽略不计,最重要的是B树更加“矮胖”,相同数量节点比二叉查找树存储更多元素,减少了磁盘IO,磁盘IO才是资源消耗的大头

B树的特征说完了,再说一下b树的插入和删除操作。假如我们要插入的值是4,自上而下的查找,得知值4应该在 3和5之间

B树的插入操作

什么是B-树?_第9张图片

但是,节点 3,5 已经有两个元素了,根据上面说的特性2,不可以在 3,5节点插入元素,父节点 2,6 也是两元素节点,也不能插入,继续向上,发现顶级节点9,它是单元素节点,可以升级成双元素节点,双元素分别为4和9,节点 2,6得拆分两个节点,分别是2和6

什么是B-树?_第10张图片

是不是很麻烦,为了插入一个节点竟然挪动了这么多节点,但是,也是因为这么麻烦,让B树维持多路平衡

B树的删除操作

假如要删除元素值11,先自上而下的查找元素值11

什么是B-树?_第11张图片

找到元素11后,进行删除,删除完后,发现节点12下面只有一个子节点了,不符合上文说的“每个中间节点包括k-1个元素和k个子节点,其中m/2 <= k <= m”,所以,找到元素值 12,13,15的中位数13,13上移一阶,节点12下移一阶成为第一个子节点(这个过程成为左旋
什么是B-树?_第12张图片

什么是B-树?_第13张图片

B树的基础概念讲完了,最后说一下B树的应用,B树主要应用文件系统和部分数据库索引,比如著名的非关系数据库MongoDB,但是,大部分关系型数据库,比如mysql,mysql没有使用B树,使用的是B+树来作为索引的实现,这是为什么呢?这个有机会再讨论吧

你可能感兴趣的:(数据结构,B树基本概念,B-树基本概念,B树查找,B树插入和删除)