redis系列7---底层数据结构之跳跃表

125 阅读1分钟

什么是跳跃表?

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

时间复杂度?

平均O(logN)、最坏O(N),可以通过顺序性操作来批量处理节点

哪里用到了跳跃表?

实现有序集合键
在集群节点中用作内部数据结构

实现

//跳跃表节点
typedef struct zskiplistNode {
    robj *obj;//成员对象,是一个指针,指向一个字符串对象,字符串对象保存着一个SDS值
    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;

什么是排位?

在查找某个节点的过程中,将沿途访问过的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位