什么是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树为例:

在这里插入图片描述

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

在这里插入图片描述

B树的查找

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
  从图中可以看出,B树查找的次数不比二叉查找树要少,特别是当某个节点内元素较多的时候,比较次数更多,但是,比较操作是在内存中进行的,所以损耗可以忽略不计,最重要的是B树更加“矮胖”,相同数量节点比二叉查找树存储更多元素,减少了磁盘IO,磁盘IO才是资源消耗的大头

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

B树的插入操作

在这里插入图片描述

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

在这里插入图片描述

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

B树的删除操作

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

在这里插入图片描述

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

在这里插入图片描述

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

posted @ 2018-09-24 18:51  Bug开发攻城狮  阅读(335)  评论(0编辑  收藏  举报