引言
跳表在Redis的面试中是一个经常会提起的难题,什么是SkipList?它的使用场景?它是怎样的一种数据结构?它是如何进行插入和删除数据?SkipList本身的优点和缺点?以及为什么Redis选择去使用这种数据结构来当作有序集合(Zset)的底层实现?本文将解决上述问题。
SkipList的定义
跳跃表(skipList)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
---《redis设计与实现》
我们传统意义上的有序链表进行查询操作时的时间复杂度是O(N),是因为有序链表在进行查询操作时需要对链表进行遍历操作,一个个找来找到需要的索引。
那如果我们多个多个找是不是会适当减少时间复杂度呢?这就是SkipList的理念所在。
一个有序的链表,如果我们使用一半的空间来建立索引,这样虽然增加了50%的内存占用,但是性能有着极大的提升。
skipList是一个典型的“空间换时间”的数据结构设计。它相比一般的链表,有更高的查找效率,可比拟二叉查找树,平均期望的查找、插入、删除时间复杂度都是O(logn)。
由于我们这里仅讨论skipList在redis中存在的形式与意义,故不对SkipList进行过于深入的研究。
Redis中的使用场景
SkipList本身的优点虽然很多,但其实在Redis中仅有两个地方被使用:
- 有序集合键(Zset)的底层实现。