跳表:为什么Redis一定要用跳表来实现有序集合,而不是红黑树?
-
Redis种的有序集合是通过跳表来实现的,严格点讲,其实还用到了散列表。Redis有序集合支持的核心操作如下:
- 插入一个数据
- 删除一个数据
- 查找一个数据
- 按照区间查找数据
- 迭代输出有序序列
- 其中,插入、删除、查找以及迭代输出有序序列这几个操作,红黑树也能完成,时间复杂度都是O(logn)。但是按照区间来查找数据这个操作,红黑树的效率没有跳表高。
- 对于按照区间来查找数据这个操作,跳表可以做到O(logn)的时间复杂度定位区间的起点,然后在原始链表中往后遍历就可以了。
-
当然,Redis 之所以用跳表来实现有序集合,还有其他原因,比如,跳表代码更容易实现,比红黑树好懂、好写多了,而简单就意味着可读性好,不容易出错。跳表更加灵活,它可以通过改变索引构建策略,有效平衡执行效率和内存消耗。
-
不过,跳表也完全不能替代红黑树。因为红黑树比跳表出现的早,很多编程语言中的Map类型都是通过红黑树来是实现的。
-
跳表是一种动态数据结构、支持快读地插入、删除、查找操作,时间复杂度都是O(logn)