面经-数据结构

面试题

面试题:B+树性能高为什么不用来替换红黑树

B+树查询效率比红黑树高,但插入删除的效率红黑树更高

HashMap源码注释中给出了一个桶中存在元素的个数和对应的概率

在这里插入图片描述

这里可以看到桶中元素个数为8的概率很低,也就是说链表转红黑树的情况很少见。而B+树虽然搜索效率高,但它的维护比红黑树麻烦,所以HashMap采用的红黑树而不是B+树

压缩列表

压缩列表实际上也是一个数组。只是数组的前三位分别存放了数组大小尾部数组长度

在访问头部和尾部时时间复杂度只有O(1),其余位置仍为O(n)

img

跳表

底层是有序链表,在节点之间加入多级索引来实现快速定位

img

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)

红黑树其实就是一种自平衡的二叉查找树,通过变色和旋转来维护二叉树

img

  • 红黑树每个节点为红色或黑色
  • 根节点一定为黑色
  • 红色节点的子节点一定为黑色(保证了根节点到叶节点路径上不会出现连续两个红色节点)
  • 叶节点也全部为黑色

它与AVL树的区别是,红黑树的左右子树高度差控制在两倍之内,而AVL树高度差控制在1之内。

为什么不用AVL树

AVL树左右子树高度差只有1,在查询效率上确实比红黑树高。但它因为要保持这种平衡,在插入和删除数据时整个树的平衡会更复杂,效率比红黑树要低。并且红黑树整体上可以将左右子树高度差控制在两倍之内,也不会牺牲太大的查询效率,所以使用红黑树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenyang1026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值