跳跃表

跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。

跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。

在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。

redis使用跳跃表作为有序集合键的底层实现之一。

和链表、字曲等数据结构被广泛地应用在redis内部不同,redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构。

typedef struct zskiplistNode {
    robj *obj;     // 成员对象
    double score;    // 分值
    struct zskiplistNode *backward;    // 后退指针

    struct zskiplistLevel {     
        struct zskiplistNode *forward;         // 前进指针
        unsigned int span;                         // 跨度
    } level[];                                         // 层
} zskiplistNode;                
typedef struct zskiplist {
    struct zskiplistNode *header, *tail;      // 表头节点和表尾节点
    unsigned long length;                        // 表中节点的数量
    int level;                                         // 表中层数最大的节点的层数
} zskiplist;    

 一个例子:

原文地址:https://www.cnblogs.com/losophy/p/10517293.html