zoukankan      html  css  js  c++  java
  • 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。
    分值相同的节点按照成员对象在字典序中的大小排序。
  • 相关阅读:
    J
    I
    uva122 二叉树的实现和层次遍历(bfs)
    A
    HDU 波峰
    2239: 童年的圣诞树
    1734: 堆(DFS)
    1731: 矩阵(前缀和)
    1733: 旋转图像(模拟)
    1728: 社交网络(概率问题 组合数/排列数)
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/14745012.html
Copyright © 2011-2022 走看看