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

时间:2014-11-06 12:59:42

标签: redis skip-lists

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

在此question上,他们指定了有关基础数据结构的更多详细信息skip list

然而,有一些特殊情况依赖于我不熟悉的REDIS实施。

  • 在排序集的头部或尾部添加可能不是O(log(n))操作,但是O(1),right?这个问题似乎与保留一致。
  • 更新成员的分数,即使顺序没有改变,仍然是O(log(n))要么是因为你把元素取出并再次插入,分数略有不同,要么因为你必须检查排序不会改变,因此差异仅在插入或更新分数之间的常量操作中。对?我真的希望在这种情况下我错了。

非常欢迎任何见解。

2 个答案:

答案 0 :(得分:2)

注意:一旦列表超过特定大小(max_ziplist_entries),将使用跳过列表,低于该大小使用的压缩列表。

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

重新。第二个问题 - 根据消息来源,更改分数是通过删除和读取成员来实现的:https://github.com/antirez/redis/blob/209f266cc534471daa03501b2802f08e4fca4fe6/src/t_zset.c#L1233& https://github.com/antirez/redis/blob/209f266cc534471daa03501b2802f08e4fca4fe6/src/t_zset.c#L1272

答案 1 :(得分:0)

  1. 在“跳过列表”中,当您在头或尾插入新元素时,您仍需要更新O(log n)级别。前一个头部或尾部可以具有O(log n)级别,并且每个级别可能都有需要更新的指针。

  2. 已由@ itamar-haber回答