Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
使用REDIS排序集,某些特殊操作的时间复杂度是多少?_Redis_Skip Lists - Fatal编程技术网

使用REDIS排序集,某些特殊操作的时间复杂度是多少?

使用REDIS排序集,某些特殊操作的时间复杂度是多少?,redis,skip-lists,Redis,Skip Lists,在REDIS文档中,它声明对排序集的插入和更新操作为O(log(n)) 在此基础上,它们指定了有关底层数据结构的更多详细信息 然而,有一些特殊情况依赖于REDIS的实现,我对此并不熟悉 在排序集的开头或结尾添加可能不是O(log(n))操作,而是O(1),这个问题似乎与保留一致 即使顺序没有改变,更新成员的分数仍然是O(log(n)),这可能是因为您取出元素并以稍微不同的分数再次插入它,或者因为您必须检查顺序没有改变,因此差异仅存在于插入或更新分数之间的常量操作中。正确的?我真希望这次我错了

在REDIS文档中,它声明对排序集的插入和更新操作为O(log(n))

在此基础上,它们指定了有关底层数据结构的更多详细信息

然而,有一些特殊情况依赖于REDIS的实现,我对此并不熟悉

  • 在排序集的开头或结尾添加可能不是O(log(n))操作,而是O(1),这个问题似乎与保留一致
  • 即使顺序没有改变,更新成员的分数仍然是O(log(n)),这可能是因为您取出元素并以稍微不同的分数再次插入它,或者因为您必须检查顺序没有改变,因此差异仅存在于插入或更新分数之间的常量操作中。正确的?我真希望这次我错了

任何洞察都是最受欢迎的。

注意:一旦列表超过某个大小(max_ziplist_条目),将使用跳过列表,低于该大小将使用压缩列表

Re。第一个问题-我相信它仍然是O(log(n)),因为跳过列表是二叉树的一种类型,所以不能保证头/尾节点在哪里

Re。第二个问题-根据消息来源,更改分数是通过删除和读取成员来实现的:&

  • 在跳过列表中,当您在head或tail中插入新元素时,仍然需要更新
    O(logn)
    levels。前面的头部或尾部可以有
    O(logn)
    级别,并且每个都可能有需要更新的指针

  • 已由@itamar haber回答


  • 从wikipedia中的跳过列表条目来看,似乎插入头是O(1),而不是尾。谢谢你的第二个问题。