面试题
面试题:B+树性能高为什么不用来替换红黑树
B+树查询效率比红黑树高,但插入删除的效率红黑树更高
HashMap源码注释中给出了一个桶中存在元素的个数和对应的概率
这里可以看到桶中元素个数为8的概率很低,也就是说链表转红黑树的情况很少见。而B+树虽然搜索效率高,但它的维护比红黑树麻烦,所以HashMap采用的红黑树而不是B+树
压缩列表
压缩列表实际上也是一个数组。只是数组的前三位分别存放了数组大小、尾部、数组长度
在访问头部和尾部时时间复杂度只有O(1),其余位置仍为O(n)
跳表
底层是有序链表,在节点之间加入多级索引来实现快速定位
B树和B+树
B树
- 所有的键值分布在树中
- 搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找
- 每个节点你最多拥有m个子树
- 根结点至少两个子树
- 分支结点至少拥有m/2棵子树
- 所有叶子节点都在同一层、每个节点最多有m-1个key
每个节点中存放着指向子节点的指针和数据库中的记录(一个主键对应一条记录)
缺点:B树每个结点存的记录是带 主键+数据的,也就是说每个结点存放的 数据可能会过大。每个结点能存放的数据就会少,从而加深树的高度。
B+树
- B+树的非叶子节点上只存放子节点的指针和主键,不存放真正的data
- 所有data信息存放在叶节点上
- B+树保存了两个头指针,一个是根节点的头指针,一个是叶节点最小的指针
- 叶节点之间是相连的成链式环结构(便于范围查找和分页查找)
优点:数据库每次查找时可以尽可能多的读取磁盘块,来进行查找
Mysql中实际使用的索引结构是B+树
B树和B+树的区别
B树的每个结点都存放了数据和子节点的指针,B+树只有叶节点存放了指针。如果数据量大的话B树每个结点会臃肿导致树的过高。并且B+树的所有数据都在叶子节点,且叶子节点间链接成一个链表范围查找时效率更高
红黑树
参考资料:JDK1.8中HashMap的红黑树 - 简书 (jianshu.com)
红黑树其实就是一种自平衡的二叉查找树,通过变色和旋转来维护二叉树
- 红黑树每个节点为红色或黑色
- 根节点一定为黑色
- 红色节点的子节点一定为黑色(保证了根节点到叶节点路径上不会出现连续两个红色节点)
- 叶节点也全部为黑色
它与AVL树的区别是,红黑树的左右子树高度差控制在两倍之内,而AVL树高度差控制在1之内。
为什么不用AVL树
AVL树左右子树高度差只有1,在查询效率上确实比红黑树高。但它因为要保持这种平衡,在插入和删除数据时整个树的平衡会更复杂,效率比红黑树要低。并且红黑树整体上可以将左右子树高度差控制在两倍之内,也不会牺牲太大的查询效率,所以使用红黑树。