使用REDIS排序集,某些特殊操作的时间复杂度是多少?
在REDIS文档中,它声明对排序集的插入和更新操作为O(log(n)) 在此基础上,它们指定了有关底层数据结构的更多详细信息 然而,有一些特殊情况依赖于REDIS的实现,我对此并不熟悉使用REDIS排序集,某些特殊操作的时间复杂度是多少?,redis,skip-lists,Redis,Skip Lists,在REDIS文档中,它声明对排序集的插入和更新操作为O(log(n)) 在此基础上,它们指定了有关底层数据结构的更多详细信息 然而,有一些特殊情况依赖于REDIS的实现,我对此并不熟悉 在排序集的开头或结尾添加可能不是O(log(n))操作,而是O(1),这个问题似乎与保留一致 即使顺序没有改变,更新成员的分数仍然是O(log(n)),这可能是因为您取出元素并以稍微不同的分数再次插入它,或者因为您必须检查顺序没有改变,因此差异仅存在于插入或更新分数之间的常量操作中。正确的?我真希望这次我错了
- 在排序集的开头或结尾添加可能不是O(log(n))操作,而是O(1),这个问题似乎与保留一致
- 即使顺序没有改变,更新成员的分数仍然是O(log(n)),这可能是因为您取出元素并以稍微不同的分数再次插入它,或者因为您必须检查顺序没有改变,因此差异仅存在于插入或更新分数之间的常量操作中。正确的?我真希望这次我错了
任何洞察都是最受欢迎的。注意:一旦列表超过某个大小(max_ziplist_条目),将使用跳过列表,低于该大小将使用压缩列表 Re。第一个问题-我相信它仍然是O(log(n)),因为跳过列表是二叉树的一种类型,所以不能保证头/尾节点在哪里 Re。第二个问题-根据消息来源,更改分数是通过删除和读取成员来实现的:&
O(logn)
levels。前面的头部或尾部可以有O(logn)
级别,并且每个都可能有需要更新的指针从wikipedia中的跳过列表条目来看,似乎插入头是O(1),而不是尾。谢谢你的第二个问题。