多叉树、多路查找树、B树、B+树、B*树介绍

What
在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiway tree)

后面会讲到2-3树(如图2)、2-3-4树、B树、B+树,他们都是多叉树

18722707-d2a265c76f96c5e8.png
图1.二叉树
18722707-006593724525cbba.png
图2.多叉树(2-3树)
Why

二叉树的操作效率较高,但是也存在问题

  • 由于构建二叉树时需要把数据从某个地方(数据库、文件等)加载到内存,如果节点少,那没什么问题,但是如果节点海量(比如上亿),在构建二叉树时,每个节点都会进行一次io操作,那么构建二叉树的速度就会很慢
  • 如果二叉树的节点海量,那么二叉树的高度也特别高,当进行增加、删除、左旋、右旋节点等操作时,速度也会变慢

由于多叉树每个节点右更多的数据项,那么相较于二叉树节点数量会变少;多叉树每个节点可以由多个子节点,那么相较于二叉树高度也会降低,通过多数据项、多子节点这种方式可以让上面提到的两个问题得到改善,提高检索和操作的效率

How
Ⅰ、23树

23树介绍:23树是一种多叉树,也是一种平衡搜索树,是最简单的B树结构

23树特点

  • 2-3树的所有叶子节点都在同一层(只要是B树都满足这个条件)
  • 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点,二节点有且仅有一个数据项
  • 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点,三节点有且仅有两个数据项
  • 2-3树是由二节点和三节点构成的树

23树构建规则

  • 三个前提条件
    • 2-3树的所有叶子节点都在同一层(只要是B树都满足这个条件)
    • 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点,二节点有且仅有一个数据项
    • 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点,三节点有且仅有两个数据项
  • 当按照规则插入一个数到某个节点时,不能满足上面三个要求,就需要拆节点,先向上拆,如果上层满,则拆本层,拆后仍然需要满足上面3个条件
  • 对于三节点的子树的值大小仍然遵守(BST 二叉排序树)的规则

下面以数列[16, 24, 12, 32, 14, 26, 34, 10, 8, 28, 38, 20]为例简述23树的构建过程

18722707-da59d7ea99a221cb.png
开始,以16构建节点
18722707-59fbdb386ef70c7e.png
插入24
18722707-28fe271899047757.png
插入12,插入后由于不满足B树特点 “所有叶子节点都必须在同一层” ,所以需要将根节点【16,24】拆开,将24作为一个叶子节点
18722707-b1f1acc604753af7.png
插入32
18722707-1f51b114b2964f5c.png
插入14
18722707-e1c62988824d451c.png
插入26,插入后也不满足B树特点 “所有叶子节点都必须在同一层”,所以需要拆节点,最终如箭头右边所示
18722707-1d105dcb9ca2379d.png
插入34
18722707-ab3196448900da34.png
插入10,同样不满足23树特点,需要拆节点,最终如最右边的结构所示
18722707-0c510df645b1be9d.png
插入8
18722707-453a05f6a89ec8d5.png
插入28,不满足23树特点,需要拆分节点,拆分节点后如箭头右边的结构所示
18722707-23bf025ecce37603.png
插入38
18722707-41dfffe00944277e.png
插入20,插入完毕

最终将数列[16, 24, 12, 32, 14, 26, 34, 10, 8, 28, 38, 20]构建成了一棵23树

除了23树,还有234树、2345树等等,概念都和23树类似,他们都是一种B树,如下图是一棵234树

18722707-067d23b2d9c0ba01.png
234树
Ⅱ、B树

B树介绍:B-tree树即B树,B即Balanced,平衡的意思,B树也是一棵平衡搜索树。有人把B-tree翻译成B-树,会让人以为B-树是另一种树,这是不对的,实际上他们所说的B-树就是B树。前面介绍了23树、234树,他们都是B树。B树通过重新组织节点,降低树的高度,提高树的构建效率,减少IO操作。我们在学习数据库时。也经常听到某种类型的索引是基于B树或者B+树的,如下图就是一颗B树

18722707-6b912d40139fa74d.png
B树示例

在B树中有以下一些概念需要明白

  • B树的阶:节点的最多子节点个数;比如23树的阶是3,234树的阶是4
  • B树的搜索:B树搜索时,从根节点开始,对接点内的关键字(有序的)进行二分查询,如果命中则结束,否则进入查询关键字所属的范围的子节点进行查找;重复指向上一步,直到查找到叶子节点或子节点指针为空
  • 关键字:关键字也就可以想象成每个节点的数据或者主键什么的,B树的关键字分布在整棵树中,也就是说叶子结点和非叶子节点都会存放数据
  • 搜素性能等价于在全集内做一次二分查找
  • 所有的叶子节点都在同一层
Ⅲ、B+树

B+树是B树的变体,也是一种多路搜索树,与B树有如下区别

18722707-9f39c6d7e9bcc719.png
B+树示例

  • B+树的关键字都出现在叶子结点,叶子节点的关键字是一颗按关键字顺序组织的链表(关键字有序),而B树的关键字分布在整棵树,叶子结点和非叶子节点都有关键字
  • 当搜索时,B+树只可能在叶子节点命中被查询的关键,不能在非叶子节点命中,而B树可以在非叶子节点命中关键字,性能也是等价于在关键字的全集内做一次二分查找
  • B+树非叶子节点的非叶子节点相当于是叶子节点的索引,称为稀疏索引,叶子节点相当于是存储关键字(数据)的数据层,叶子节点也叫稠密索引
  • B+树更适合文件系统
  • B+树和B树各有应用场景,没有优劣之分
Ⅲ、B*树

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

18722707-4f4f179dc53bdc5a.png
B*树示例

B*树的说明:

  • B*树规定了非叶子结点关键字个数至少为(2/3)*M(M为树的度),即块的最低使用率为2/3,而B+树的块的最低使用率为B+树的1/2
  • 从上面的特点可以看出B*树分配新节点的概率要比B+树低,空间使用率更高

以上就是对多叉树(也叫多路查找树)、B树、B+ 树、B*树的一些介绍,并没有提供代码实现,因为实现起来并不简单,而且一般程序员很少自己去实现B树,只需要了解其原理即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值