跳表是一种有序的数据结构,它通过在每个节中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
跳跃表支持平均(LogN)最坏O(N)时间复杂度的查找。
跳跃表作为有序集合键的底层实现之一。
redis两个地方用到了跳跃表:一个是实现有序集合键、另外一个是在集群节点中用作内部数据结构,除此之外没有其他用处了。
5.1 跳跃表的实现
redis.h/zksiplistNode
和redis.h/zskiplist
两个结构定义。
位于skiplist
右方是4个skiplistNode
节点,每层是代表层数,右指针右边跨越数。BW 指向位于当前节点的前一个节点用于从后往前遍历时使用。
5.1.1 跳跃表节点
1、层 扔硬币法则 幂次定律 只有在1-32之间,所以level[0]
就是第一层如此类推。
2、前进指针 每个层都有一个指向表尾方向的前进指针,用于从表头向表尾方向访问节点。
3、跨度 两个节点之间跨度越大 他们距离得越远。
指向NULL的所有前进指针跨度都为0,因为他们没有连向任何及诶单。
4、后退指针
5.1.2 跳跃表
查找就是与下一个比较,如果比它大就继续向右 如果比它小就向下一层。
跳表和平衡树的比较:
范围查找、简单、内存少、不复杂。跳表就是
redis数据结构分析
5.2 跳跃表API
5.3 重点回顾
- 跳跃表是有序集合的底层实现之一
- redis的跳跃表是有zskiplist和zskiplistnode以及ziplist、zset实现的。
- 每个跳跃表节点层高都是1-32的随机数
- 同一个跳跃表中 有多个包含相同的分分值,用字典序排序。