Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm skiplistnode变量是什么;span";在redis.h是什么意思?_Algorithm_Data Structures_Redis_Skip Lists - Fatal编程技术网

Algorithm skiplistnode变量是什么;span";在redis.h是什么意思?

Algorithm skiplistnode变量是什么;span";在redis.h是什么意思?,algorithm,data-structures,redis,skip-lists,Algorithm,Data Structures,Redis,Skip Lists,在redis.h中,skipnode的定义如下: typedef struct zskiplistNode { robj *obj; double score; struct zskiplistNode *backward; struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; } level[]; } zskiplistNode;

在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
是什么意思?此变量存储什么?

span
在特定节点存储当前节点和当前级别的节点之间的节点数->转发
span
用于计算跳过列表中元素的基于1的排名

例如,考虑下面的跳过列表:

考虑头部节点。所有级别的跨度均为1

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


请看下面的图片。你可以看到等级是如何从每个等级的跨度值计算出来的。

你的答案很好~~~~非常感谢~~但我认为skiplist可以被红黑树或八字树取代,它们可能有更好的性能。不,它不能。跳过列表提供了RB树或splay树没有的一个有趣属性。它可以以log(n)成本找到第n项。例如被ZRANGE使用。我认为splay tree还可以在节点中添加一个额外的元素,以log(n)的成本找到第n个项目。但是splay花了更多的时间来写和读主内存,这对redis来说并不像我想的那样方便。