树
二叉查找树 -> 平滑二叉树(AVL) -> 2-3树(B、B-树) -> 红黑树 -> B+树
平衡二叉树、2-3树、红黑树、B+树都属于平衡树
平衡树是计算机科学中的一类数据结构,为改进的二叉查找树。一般的二叉查找树的查询复杂度取决于目标结点到树根的距离(即深度),因此当结点的深度普遍较大时,查询的均摊复杂度会上升。为了实现更高效的查询,产生了平衡树。
二叉查找树
二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
平滑二叉树
平滑二叉树,在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1
2-3树
B树 出度 = 关键字数+1
- 若根结点不是终端结点,则至少有2棵子树
- 除根节点以外的所有非叶结点子树范围[M/2,M],M/2向上取整(关键字数为子树减一)
- 所有的叶子结点都位于同一层
红黑树
红黑树是抽象化的2-3树 算法4对于红黑树与2-3树直接的关系有详细的总结
B+树
出度 = 关键字数
- 若根结点不是终端结点,则至少有2棵子树
- 除根节点以外的所有非叶结点子树范围[M/2,M],M/2向上取整(关键字数与子树相同)
- 所有的叶子结点都位于同一层非叶子节点仅用作索引,它的关键字和子节点有重复元素
- 叶子节点用指针连在一起
磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多
各种树的比较
红黑树与B+树在索引中的比较
红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B+ Tree 作为索引结构,主要有以下两个原因:
(一)更少的查找次数
平衡树查找操作的时间复杂度和树高 h 相关
红黑树的出度为 2,而 B+ Tree 的出度一般都非常大,所以红黑树的树高 h 很明显比 B+ Tree 大非常多,查找的次数也就更多。
(二)利用磁盘预读特性
为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的磁盘旋转时间,速度会非常快。
操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入。
B树与B+树在索引中的比较
在mysql中经常出现范围查询的情况,此时使用B+树性能更高