一尘不染

Redis:当插入的元素位于开头或结尾时,ZADD是否优于O(logN)?

redis

ZADD 的redis 文档指出操作为O(log N )。

但是,有人知道插入的元素位于排序顺序的开头还是结尾时,ZADD是否比O(log N )好?

例如,对于某些实现,这可能是O(1)。

具体来说,redis 教程指出:

排序集是通过包含跳过列表和哈希表的双端口数据结构实现的,因此,每次添加元素时,Redis都会执行O(log( N ))操作。

修改跳转列表以支持O( k )在开头和结尾处插入似乎是合理的,其中 k 是跳转列表的最大级别。


阅读 248

收藏
2020-06-20

共1个答案

一尘不染

我已经在Redis网站上交叉发布了这个问题,Pieter Noordhuis在此处提供了答案,我在这里交叉发布:


那是正确的。排序集依靠RNG来确定每个节点的级别数(这是一个概率数据结构)。在跳过列表的开头插入/删除元素可以是O(1),而理论上最坏的情况是O(N)(每个节点的级别相同)。但是,当您考虑节点之间的级别分布时,摊销时间复杂度为O(log
N)。

2020-06-20