【问题标题】:What does the skiplistnode variable "span" mean in redis.h?redis.h 中的 skiplistnode 变量“span”是什么意思?
【发布时间】:2012-05-14 13:45:25
【问题描述】:

redis.h中,skipnode定义如下:

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

var span 是什么意思?这个 var 存储什么?

【问题讨论】:

    标签: algorithm data-structures redis skip-lists


    【解决方案1】:

    span在特定节点上存储当前节点和node->forward在当前级别之间的节点数。 span 用于计算跳过列表中元素的从 1 开始的排名。

    例如,考虑以下跳过列表:

    考虑头节点。所有级别的跨度都是1。

    考虑节点 1。在级别 0,跨度为 1,因为如果您跟随前向指针,您将 span 1 个元素。在级别 1,span 为 2,因为如果您跟随前向指针,您将 span 2 个元素(节点 2 和节点 3)。

    看看function zslGetRank in t_zet.c。您可以看到如何根据每个级别的 span 值计算排名。

    【讨论】:

    • 你的回答太棒了~~~非常感谢~~~不过我估计skiplist可以换成red-black tree或者splay-tree可能会更好的表现。
    • 不,它不能。跳过列表提供了 RB-trees 或 splay tree 所没有的一个有趣的属性。它可以以 log(n) 成本找到第 n 个项目。例如被 ZRANGE 使用。
    • 我认为 splay 树也可以在 log(n) 成本下找到第 n 个项目,并在节点中添加一个额外的元素。但是splay花更多的时间来写和读主存,这对redis来说不是那么方便,就像我想的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2022-01-25
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多