文章出处:数据结构和算法之树形结构B树(6)
前面两章节我们介绍了红黑树,了解到红黑树的查找和删除能通过变色减少自旋的次数,从而在大规模数据情况下比AVL树带来更好的性能。不论红黑树还是AVL树都是平衡二叉查找树,它们主要场景是适用于内存中的动态数据结构:对于数据在内存中的情况,例如Java中的TreeMap和HashMap,红黑树的表现是非常优异的;但是对于数据在磁盘等辅助存储设备中的情况例如MySQL等数据库,红黑树并不擅长,因为红黑树长得还是太高了;当数据在磁盘中时,磁盘IO会成为最大的性能瓶颈,设计的目标应该是尽量减少IO次数;而树的高度越高,增删改查所需要的IO次数也越多,会严重影响性能。今天我们来了解另一种适用于大规模数据存储和磁盘访问的树结构:B树(B-Tree);与二叉树相比,B树的每个非叶节点可以有多个子树,因此当总节点数量相同时,B树的高度远远小于AVL树和红黑树(B树是一棵“矮胖子”),因而磁盘IO次数大大减少。
一、基本概念
B树是一种自平衡的多叉树,主要用于维护排序数据的有序性,以便进行插入、删除和查找操作,特别适用于磁盘或其他直接存取辅助设备的数据管理。 相关基本概念如下图:
定义B树最重要的概念是阶数(Order),对于一棵m阶B树(m>=3),或是空树,或者需要满足以下条件:
1. 每个节点最多包含 m 个子节点。
2. 根节点则至少包含 2 个子节点并至少包含一个关键字。
3. 除根节点外,每个非叶子节点至少包含 m/2 (向上取整)个子节点。
4. 拥有 k 个子节点的非叶子节点将包含 k - 1 个关键字。
5. 所有叶子节点都在同一层中。
6. 每个叶子节点至少有m/2-1(向上取整)个关键字。
下图是一棵3阶的B树也常被称为2-3树,3阶限定了B树节点的子节点数最多为3;第一层是根节点,蓝色为关键字(17),棕黄色为指向子节点的地址,此处根节点只有两个子节点,满足上述规范1和2;第二层是两个非叶子节点且都有三个叶子节点作为子节点,所有非叶子节点关键字为两个,即子节点数减1,满足规范1、3和4;第三层是叶子节点,叶子节点无子节点,只有关键字,满足规范5和6(这里的关键字可以等同理解为记录):
从上述规范和上图可以直观地看出,B树的定义,对非叶结点的子节点数量和关键字顺序有一定的约束和限制。其中,对于节点最少节点数的限制,是为了避免在极端情况下,B树退化成二叉树或链表,例如当B树中节点的子树变成2或1或0。而关于顺序的约束,一个非叶子节点的关键字Key[n]和关键字Key[n+1]之间的子节点Child[n+1]的关键字值大小介于关键字Key[n]和关键字Key[n+1]之