多路查找树
二叉树的查询效率非常高,但也存在问题,当二叉树的数据量非常大,节点非常多的时候,因为二叉树要求最多左右两个子节点,会导致二叉树的高度很高。我们一般在构建二叉树的时候会伴随很多IO操作如从文件系统读取获取或者数据库读取数据,过高的二叉树会导致操作效率的低下,如果数据量过于庞大内存也支撑不了。在AVL节点很多的时候,当插入元素之后为保持平衡会频繁的调整节点的位置,导致性能的下降。
从而引出了多叉树,允许在一定情况下一个节点可以保存多个数据,一个节点也允许挂多个子节点,这样就大大减少的树的高度,增加的树的添加查询效率。
常用名词
- 阶 一个B树的阶就是一个节点下面最多挂几个子节点的个数 如2-3树 因为子节点最多为3个则为2-3树的阶为3 如果记做m
- 根节点的关键字范围 1 <= key <= m-1
- 非根节点的关键字范围 m/2 <= key <= m-1
常见的多叉树
-
2-3树 2-3-4 树
2-3树是最简单的B树,2-3树的节点有2个子节点的称2节点,有3个子节点的称3节点,2节点中包含一个元素和2个子节点(只能是2个节点或者没有节点,不能出现只有1个子节点的情况),3节点要求有2个元素,左节点包含较小元素,右子树包含较大元素,中节点包含介于节点元素之间的元素。
2-3树的插入规则
- B树要求所有叶子节点要求在同一层
- 2节点中要么没有子节点要么有2个节点
- 3节点中要么没有子节点要么有3个节点
- 当插入某一个节点打破上述规则时候,需要向上拆分,如果上层满了就拆本层,直到满足条件
- 3节点的子树也一样遵守排序二叉树规则
-
2-3-4树与 2-3树类似 只是节点元素可以是3个,子节点可以有4个
B树
B-tree树即B树,B为Balance的意思。2-3树和2-3-4树就是一种简单的B树。图示如2-3树
- B树中所有的关键字都是升序排序,左小右大.
- B树的搜索,从根节点开始,对节点内的关键字(有序)进行二分查找,如果命中则返回,如果没有命中,进入关键字范围类的子节点继续查找,一直到叶子节点都没有找到则返回空
- B树的特点是关键字分布在非叶子节点和叶子节点上,可能在非叶子节点就直接命中
- 搜索的性能等价于在全集中进行二分查找
- B树左右叶子节点必须在同一层
B+树
B+树是B树的一种变体也是多路查找树。
- B+树中的非叶子节点中有指针指向了相邻的下一个兄弟非叶子节点
- B+树跟B树相似,只是B+树要求所有的关键字必须存放在叶子节点,只能在叶子节点命中,搜索性能也等价于在全集中进行二分查找
- 所有的关键字存在叶子节点的有序链表中也称为稠密索引
- 非叶子节点相当于叶子节点的索引,用于快速定位关键字在哪个叶子节点的链表中,也称稀疏索引
- 适合文件系统和数据库的索引设计 因为文件系统和数据库系统的数量很庞大,通过稀疏索引逐步定位到稠密索引的形式,降低了内存的压力,也提高了效率
B*树
B*树是最B+树的一个变体
- B*树定义了非叶子节点关键字的个数至少为(2/3)M,即块的使用率至少是2/3,而B+树的块使用率没1/2
- B*树分配新节点的概率比B+树低,空间使用率更高
- B树的非叶子节点有指针指向下一个非叶子节点 即索引节点 (B星树特有)
- B*树的叶子节点也有指针指向下一个叶子节点 即数据节点 (与B+树相同)
B树跟B+树的区别
B+树的优点
- 非叶子节点不存在数据,使得非叶子节点能存在更多的关键字,数据存放紧密
- 叶子节点中存在相邻兄弟节点的引用使得调整结构更加的效率
- 又由于叶子节点存在兄弟节点引用的缘故所以在返回查询的时候对于跨区间的查询可以直接利用到叶子节点上的兄弟指针,便于区间查询和搜索,而B树需要进行每层的递归遍历
- 所有节点必须查询到叶子节点,查询性能稳定
B树的优点
- 因为B树的每一个节点都会存在数据,如果经常访问到离根节点路径小的数据时,能够快速返回,在数据节点不多的时候性能较高
最后推荐一个算法和数据结构可视化的网站上面动态的展示一些数据结构和算法的操作步骤,便于初学者理解
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html