红黑树
红黑树的介绍
- 红黑树是一种特殊的二叉搜索树
- 红黑树的约束
- 每个节点要么是红色,要么是黑色
- 根节点是黑色的
- 每个叶子节点(特指为NULL)为黑色
- 如果一个节点是红色的,那么他的子节点必须是黑色的
- 任意一个节点 到 该节点的所有叶子节点的路径 上的黑色节点数目是相同的
- 这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。
- 红黑树和AVL树相比:红黑树是一种弱平衡二叉树,所以对于相同节点的两种树,AVL树的高度往往小于红黑树。但是在红黑树中删除、添加节点时,旋转树的次数比较少,因此维护成本比AVL树低。
红黑树的应用
- Java集合中的TreeSet和TreeMap是通过红黑树来实现的
- Java集合中的HashMap底层数组在解决哈希冲突时,可能会使用到红黑树
- 使用红黑树的好处就是为了避免二叉搜索树的缺点,即二叉搜索树在某些情况下会退化成一个线性结构
红黑树的时间复杂度
- 红黑树的时间复杂度是O(logn)。可以证明红黑树的高度h小于等于2log(n+1)
B树
B树的介绍
-
B树是一种【平衡的多路查找树】,把树中结点最大的孩子数目(也就是子树的数目)成为B树的阶,记为m
-
一棵m阶的B树要么是空树,要么是具有以下性质的m叉树
- 树的每个节点至多有m棵子树(即最多有m-1个关键字)(上界)
- 树的根节点如果不是终端节点,那么至少有两棵子树(即至少有1个关键字)(下界)
- 除了根节点以外的所有非叶节点至少有【m/2向上取整】棵子树(下界)
- 所有的叶子节点都出现在同一层,且不带信息
-
B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树。相对于二叉树,B树的每个节点有多个分支,可以存储多个键值和数据,所以与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度,查找数据会更加高效。
B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数。在关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少.
B树的应用
- 数据库
- 磁盘
B+树
B+树的介绍
- m阶B+树和m阶B树的主要差异在于:
- 具有n个关键字的节点只有n棵子树,每个关键字对应一颗子树(B树n个关键字的节点有(n+1)棵子树)
- B+树的结点的关键字的数量的上界和下界有相应的变化:根节点的关键字数量[1,m],非根节点的关键字数量[m/2向上取整,m]
- 在B+树中,叶子节点包含信息,所有的非叶节点仅仅起到索引的作用:非叶节点的每个关键字是对应子树的最大关键字和指向该子树的指针。而B树的每一个关键字都对应着一个记录的存储地址。
- B+树中叶子节点包含全部的关键字
- 在B+树中,有一个指针指向关键字最小的叶子节点,所有叶子节点连接成了一个单链表
B+树的应用
- 数据库
- 操作系统的文件系统
常见面试题:
B树和B+树的区别?和红黑树的区别?
- 节点存储内容的角度:B 树的所有节点既存放 键(key) 也存放 数据(data);而 B+树只有叶子节点存放 键(key) 和 数据(data),其他内节点只存放键。这样会使得固定大小的每个节点存储更多的键,从而进一步减少树的高度。
- 叶子节点角度:B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点,并且B+树的叶子节点保存着全部的关键字。那么会使得遍历整棵树的所有元素更加方便,也会使得 查询某一范围内的数据 更加方便
- 检索过程的角度:B 树的检索的过程相当于对 范围内的每个节点的关键字 做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定,任何查找都是从根节点到叶子节点的过程,所有关键字查询的路径长度相同,导致每一个数据的查询效率相当
- 为什么说B+树比B树更适合实际应用中操作系统的文件索引和数据索引?
- 节点存储的角度
- 叶子节点的角度:数据库索引采用B+树的主要原因是:B树在提高了IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。
- 检索过程的角度
- 和红黑树的区别:
- 因为B/B+树是多叉树,所以与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度。
- B树和B+树的叶子节点都在同一层
跳表了解吗?跳表和红黑树的应用场景的区别?
- 跳表是可以进行二分查找的有序链表。
- 跳表查询、插入、删除的时间复杂度为O(logn)