问题:为什么Redis一定要用跳表来实现有序集合,而不是红黑树?
1. 跳表定义
- 有多级索引的链表结构,就是跳表。
- 加来一层索引之后,查找一个结点需要遍历的结点个数减少了,也就是说查找效率提高了。
2. 跳表复杂度
- 在跳表中查询任意数据的时间复杂度就是 O(logn)。
- 插入、删除操作的时间复杂度也是 O(logn)。
- 空间复杂度是 O(n)。
3. 跳表索引动态更新
- 跳表是通过随机函数来维护其“平衡性”。
- 随机函数的选择很有讲究(可以看Redis 中关于有序集合的跳表实现)。
4. 解答
-
redis中的有序集合支持的核心操作主要有:
插入一个数据;
删除一个数据;
查找一个数据;
按照区间查找数据(比如查找值在[100, 356]之间的数据);
迭代输出有序序列。 -
原因A: 按照区间来查找数据这个操作,红黑树的效率没有跳表高。跳表可以做到 O(logn) 的时间复杂度定位区间的起点,然后在原始链表中顺序往后遍历就可以了,这样做非常高效。
-
原因B: 跳表更容易代码实现,可读性好,不容易出错。
-
原因C: 跳表更加灵活,它可以通过改变索引构建策略,有效平衡执行效率和内存消耗。
-
不过,跳表也不能完全替代红黑树。因为红黑树比跳表的出现要早一些,很多编程语言中的 Map 类型都是通过红黑树来实现的。我们做业务开发的时候,直接拿来用就可以了,不用费劲自己去实现一个红黑树,但是跳表并没有一个现成的实现,所以在开发中,如果你想使用跳表,必须要自己实现。