redis设计与实现总结--跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
查找效率平均O(logn),最坏O(N),redis有序集合键的底层实现之一。
 
zskiplist包含四个重要成员变量
header:指向跳跃表的表头节点。
tail:指向跳跃表的表尾节点。
level:记录目前跳跃表内,层数最大的哪个节点的层数(表头节点不算其中)。
length:记录跳跃表的长度,也就是包含节点的数量(表头不算)。
 
其中跳跃表的节点结构
typedef struct zskiplistNode{
    //后退指针
    struct zskiplistNode *backward;
    //分值,按分值从小到大排序
    double score;
    //成员对象
    robj *obj;
    //
    struct zskiplistLevvel{
        //前进指针 
        zskiplistNode *forward;
        //跨度
        unsigned int span;
    } level[];
}zskiplistNode;
其中层每次根据幂次定律随机生成1—32之间的值作为level数组的大小。
跨度:用于记录两个节点的距离,指向null的所有前进指针的跨度为0,其他为1。主要用于计算排位(跨度累加)。
后退指针:用于从尾开始遍历节点。
obj:指向一个字符串对象,保存SDS。
分值相同的节点按照成员对象在字典序中的大小排序。
原文地址:https://www.cnblogs.com/2462478392Lee/p/14745012.html