第五章 跳跃表

2019-11-03  本文已影响0人  亮亮_ff3d

5.1跳跃表的实现

WechatIMG62.jpeg

5.1.1 跳跃表节点

结构定义

typedef struct zskiplistNode{
    //后退指针
    struct zskiplistNode *backward;
     //分值
    double score;
     //成员对象
    rob *obj;
     //层
    struct zskiplistLevel{
         //前进指针
        struct zskiplistNode *forward;
         //跨度
        unsigned int span;
    } level[];
}zskiplistNode;
WechatIMG63.jpeg

5.1.2 跳跃表

多个跳跃表节点就可以组成一个跳跃表,通过zskiplist结构来持有这些节点;

结构定义

 typedef struct zskiplist{
    //表头节点和表尾节点
    structz skiplistNode *header ,*tail;

    //表中节点的数量
    unsigned long length;

    //表中层数最大的节点的层数
    int level;
} zskiplist;

header 和 tail 分别指向表头和表尾节点,定位表头或表尾节点的时间复杂度是O(1);
length属性来记录节点的数量,时间复杂度为O(1);
level属性获取跳跃表中最大的节点层的数量,时间复杂度为O(1);

跳跃表API

函数:作用 时间复杂度
zslCreate:创建一个新的跳跃表 O(1)
zslFree:释放给定的跳跃表,以及表中包含的所有节点 O(n)
zslInsert:将包含给定成员和分值的新节点添加到跳跃表中 平均O(logN),最坏O(N)
zslDelete:删除跳跃表中包含给定成员和分值的节点 平均O(logN),最坏O(N)
zslGetRank:返回包含给定成员和分值的节点在跳跃表中的排位 平均O(logN),最坏O(N)
zslGetElementByRank:返回跳跃表在给定排位上的节点 平均O(logN),最坏O(N)
zslIsInRange:给定一个分值范围(range),比如0-15,如果给定的分值范围包含在跳跃表的分值范围内,就返回1,否则返回0; 通过表头和表尾节点检测,可以用 O(1)完成
zslFirstInRange:给定一个分值范围,返回表中第一个符合这个范围的节点 平均O(logN),最坏O(N)
zslLastInRange:给定一个分值范围,返回表中最后一个符合这个范围的节点 平均O(logN),最坏O(N)
zslDeleteRangeByScore:给定一个分值范围,删除跳跃表中所有在这个范围的节点 O(N)
zslDeleteRangeByRank:给定一个排位范围,删除跳跃表中所有在这个范围的节点 O(N)
上一篇 下一篇

猜你喜欢

热点阅读