求大佬解答
1.redis为什么不用红黑树或者b+树
2.hashmap为什么不用跳表和b+树
3.mysql索引为什么不用跳表和红黑树
求佬解答,感激不尽
2.hashmap为什么不用跳表和b+树
3.mysql索引为什么不用跳表和红黑树
求佬解答,感激不尽
全部评论

其实很简单,下策:你把redis用跳表,hash用红黑树,mysql用b➕树的底层加原理讲透。最简单用redis进行举例,跳表的优点,查询时间复杂度Ologn,尽管和红黑树,b➕查询时间复杂度一致,但是从redis作用场景使用场景上来说做读多于写,减少了写时自平衡开销,再衍生一点,缓存数据量肯定没有内存大,这点对比b➕树来说,他的插入性能更好,主打一个灵活,想不出来就灵活进行举例优缺点,只要你够熟,面试官就不会追着你拷打这个问题,再说了,都能举例优缺点了,肯定也没问题的

1.红黑树不能范围查询,b+树实现太复杂了,redis作者手撕不出来

Redis:跳表在进行范围查询时优于红黑树,内存占用优于B+树;
HashMap:HashMap 通常不需要进行范围查询,并且比跳表占用的内存空间更少(每个节点最多两个指针),这也是不选择B+树的原因(内存占用太大了);
MySQL:InnoDB 存储引擎下内存与磁盘进行数据交换的单位是页,跳表和红黑树占用的内存空间是离散的,每进行一次比较就需要进行一次磁盘 IO,B+树在非叶子节点中保存索引,一次磁盘IO就能更快锁定数据所在的范围(在内存中进行比较的速度是很快的),B+树最大的优点就是磁盘 IO 次数少。

我觉得问这种问题真挺逆天的,我只记得小林里面有说跳表vs红黑树,这踏🐴就是开发者来了也只挤出来三个理由,而且还不是那种决定性的理由,不过确实很有道理。
凭记忆能想起来原因之一是跳表更简单,更好维护和调试。

可以看小林coding,我记得原因是这样的
1 为什么mysql用b+树?因为mysql基于磁盘,磁盘io很慢,b+树一个节点可以存100个数据,那么一次i9就可以比较100个数据,3次io就可以定位100w的区分度了,减少了磁盘io次数就提升了性能。
2 为什么redis用跳表,因为跳表比b+树维护索引要简单的多,每次插入节点只需要考虑需不需要向上层增加索引节点即可,不需要考率索引节点分裂的情况。
3为什么hashmap用红黑树?这个我自己想的,可能是因为红黑树不需要维护索引结点,所以没有额外的空间开销,因为不像mysql和redis都是数据库,数据量非常大,对读写性能要求都特别高。
mysql不用红黑树,红黑树是二叉树,只能有两个子节点,相同数据量下层数更大,io操作次数更多
我觉得是
1红黑树和b+树实现比跳表复杂,而且红黑树不支持范围查询,对于b+树更多的是考虑每一个数据页节点能够尽量的占满磁盘的每一个簇,redis都是基于内存操作没有这方面的考虑
2hashmap同样是不支持范围查询
3为什么不用跳表1有说了,然后红黑树就是因为是二叉树结果,每次io能读取到的节点有限,io次数多,性能就低综合来说b+树更好
1. 范围查询排除红黑树,跳表和b+树都可以,底层都是索引。
2. hashmap只需要查询,红黑树做查询内存消耗低(其他两个都需要维护顺序)。
3. 范围查询排除红黑树,磁盘I/O问题,B+树是用的页来存储,I/O效率更好。
m
如果redis用的红黑树又该问为什么不用跳表了😂
用跳表是因为跳表好维护,对于redis这种速度极快但大小受限的应用来说,使用索引会不仅不会加快到哪去,反而增加了维护的成本,反比mysql,mysql的io速度很慢,但空间大小绰绰有余,至于索引大小啊维护成本啊根本不在乎,在乎的是如何快速的找到减少io次数。

为啥大家没有人考虑空间复杂度啊,跳表应该比红黑树更占地方吧?个人愚见,查询性能在内存应该差不多,就算多查一层少查一层也没什么所谓,redis为了实现简单可以忽略一些空间,但是java可能考虑gc等等的需要同时平衡时空复杂度,红黑树就显得更靠谱一些。

cy
看了大家的回答我就放心了😋
m
我记得redis的八股说是跳表+哈希表不用存储节点的颜色信息所以节省了空间,删除节点不用考虑树的平衡性,实现简单
相关推荐
06-04 18:03
河南工程学院 Java 点赞 评论 收藏
分享