美文网首页
跳跃表节点

跳跃表节点

作者: c84f3109853b | 来源:发表于2017-07-06 16:57 被阅读0次

    typedef struct zskiplistNode {
    struct zskiplistLevel {
    struct zskiplistNode *forward;
    unsigned int span;
    } level[];
    struct zskiplistNode *backward;
    double score;
    robj *obj;
    } zskiplistNode;

    1. 层

    跳跃表节点的level数组可以包含多个元素,每个元素都包含一个指向其他节点的指针,程序可以通过这些层来加快访问其他节点的速度,一般来说,层的数量越多,访问其他节点的速度就越快。

    每次创建一个新跳跃表节点的时候,程序都根据幂次定律(power law,越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小,这个大小就是层的“高度”。

    2. 前进指针

    每个层都有一个指向表尾方向的前进指针(level[i].forward属性),用于从表头向表尾方向访问节点。

    3. 跨度

    层的跨度(level[i].span属性)用于记录两个节点之间的距离:

    • 两个节点之间的跨度越大,它们相距得就越远。
    • 指向NULL的所有前进指针的跨度都为0,因为它们没有连向任何节点。

    初看上去,很容易以为跨度和遍历操作有关,但实际上并不是这样,遍历操作只使用前进指针就可以完成了,跨度实际上是用来计算排位(rank)的:在查找某个节点的过程中,将沿途访问过的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位。

    4. 后退指针

    节点的后退指针(backward属性)用于从表尾向表头方向访问节点:跟可以一次跳多个节点的前进指针不同,因为每个节点只有一个后退指针,所以每次只能后退至前一个节点。

    5. 分值和成员

    节点的分值(score属性)是一个double类型的浮点数,跳跃表中的所有节点都按分值从小到大来排序。

    节点的成员对象(obj属性)是一个指针,它指向一个字符串对象,而字符串对象则保存着一个SDS值。

    在同一个跳跃表中,各个节点保存的成员对象必须是唯一的,但是有多个节点保存的分值却可以是相同的:分值相同的节点将按照成员对象在字典序的大小来进行排序,成员对象较小的节点会排在前面(靠近表头的方向),而成员对象较大的节点则会排在后面(靠近表尾的防线)。

    相关文章

      网友评论

          本文标题:跳跃表节点

          本文链接:https://www.haomeiwen.com/subject/oxzhhxtx.html