MySQL中的数据结构(2):B-Tree的推演(二叉搜索树、AVL树)

84 阅读1分钟

 二叉搜索树

特点

  1. 一个节点只有两个子节点(二叉树)

  2. 左子节点 < 目前节点 <= 右子节点 (有序性)

image.png

查找 | 插入 key

当进行增删查改等操作时,系统会从头节点开始往下遍历,判断key 和 遍历到的节点的关系,一般时间复杂度都是 O(log2N),但存在特殊情况;

eg:查找

1.key 大于 当前遍历节点,则往右子树去遍历查找

2.key 等于当前遍历节点,则返回当前节点

3.key小于 当前遍历节点,则往左子树取遍历查找

缺陷

特殊情况(时间复杂度:O(n)):

image.png

 这棵树在性能上已经退化成了一条链表,时间复杂度也变成了O(n):树的深度是7,而最差的情况需要7次比较才能找到节点。

为了提高效率,我们要尽量减少磁盘IO次数,这就需要尽量降低树的高度,把 瘦高 的树变得扁平,树每层的分叉越多越好,由此推出了AVL树

AVL树

AVL树 — 平衡二叉搜索树(Balanced Binary Tree)

一般的平衡二叉树:平衡二叉搜索树、红黑树、数堆、伸展树

特性

  1. 可以是一棵空树;

  2. 它的左右两个子树的高度绝对值不超过1,并且左右两个子树都是一棵平衡二叉树(AVL树)

B-Tree的引出

AVL树是在二叉搜索树的基础上进行了改进,其搜索时间复杂度:O(log2N),当层数n比较高时,如下图所示: 

image.png

针对搜索同样的数据,若是我们把平衡二叉树改为 平衡N叉树,树的高度会急剧降低,数再次从“瘦高” 变成更加“矮胖”,而这就等同于我们的B-Tee(B树)。

image.png

B-Tree

概述

B树的英文是Balance Tree,也就是多路平衡查找树,简写为B-Tree。

B-Tree 的每个节点都是一个磁盘块,每个磁盘块中包含了关键字和子节点的指针。若是一个磁盘块有x个关键字,那么指针数就有x+1个。如下图所示:

image.png B树适用于存储大量的索引:对于一个100阶的B树(每个节点有100个子节点),若有三层就可以存储越100万的索引数据。

特性

对于一个M阶的B树(M>2)有以下特性:

  1. 根节点的儿子数范围是[2,M]

  2. 每个中间节点包含k个关键字、k+1个孩子;

  3. 所有叶子节点位于同一层。