跳跃表
跳跃表 (skiplist) 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针从而达到快速访问节点的目的。
跳跃表是 redis 有序集合 zset 的底层实现方式之一。(当元素个数<128的时候,用 ziplist 实现)
原理
首先从有序数组
说起,对于有序数据的查找,可以使用二分查找法将时间复杂度降到 O(logn),但是插入和删除都需要 O(n) 的复杂度。
再说链表
,查找时需要从头节点开始遍历,复杂度为 O(n),不过插入、删除只需要移动指针,复杂度为 O(1)。
查找 | 插入/删除 | |
---|---|---|
有序数组 | O(logn) | O(n) |
链表 | O(n) | O(1) |
跳表可以看作用二分查找法对链表进行优化,达到查找只需O(logn)的复杂度。
如图,看成一个优化后的链表结构,如果要查找元素9,无需像链表一样遍历,只需要找到第二层,就可以直接找到。链表的分层就类似二分查找,所以查找只需 O(logn) 的复杂度,同时插入和删除不再是对一个链表进行指针移动,而是这 (logn + 1) 个,插入/删除也就需要 O(logn) 的复杂度。
跳表原理的简单理解如上,redis 的具体实现更为复杂。
待续。。。。。