目录 跳表 使用场景 结构描述 查询算法 插入算法 删除算法 时间复杂度 空间复杂度 总结 Redis使用跳表而不是红黑树? 跳表 使用场景 跳表(Skiplist )是一个特殊的链表,相比一般的链表,有更高的查找效率,可比拟二叉查找树, 平均期望的查找、插入、删除 时间复杂度都是O(log n) ,许多知名的开源软件(库)中的数据 结构均采用了跳表这种数据结构∶ Redis中的有序集合zset LevelDB、RocksDB、HBase中Memtable Apache Lucene中的Term Dictionary、Posting List 结构描述 我们拿我们以前的有序链表相比: 我们可以很清楚的看出,有序链表的查询比较慢,时间复杂度为O(n),它的删除和插入操作比较快,我们怎样才能让它的查询的时间复杂度也变快呢? 能不能将我们的链表实现二分的查找,也就是longN,答案是肯定的,也就是我们下面所说的这种跳表。 查询算法 跳表的查询和我之前做过的一道题特别类似, 二维数组的查找 假设我们查询 31 这个数字 我们的header开始,依次进行查询, 31不在负无穷到17,往右边,到达17,继续比较,在17到正无穷之间,往下跑 … 整个查询过程如下所示 插入算法 对于插入来说,我们比如要插入一个21的数值 类似查询算法,到达17这个点,进一步到达20这个点,然后在20的后面进行插入