ZADD 的redis 文档指出操作为O(log N )。
但是,有人知道插入的元素位于排序顺序的开头还是结尾时,ZADD是否比O(log N )好?
例如,对于某些实现,这可能是O(1)。
具体来说,redis 教程指出:
排序集是通过包含跳过列表和哈希表的双端口数据结构实现的,因此,每次添加元素时,Redis都会执行O(log( N ))操作。
修改跳转列表以支持O( k )在开头和结尾处插入似乎是合理的,其中 k 是跳转列表的最大级别。
我已经在Redis网站上交叉发布了这个问题,Pieter Noordhuis在此处提供了答案,我在这里交叉发布:
那是正确的。排序集依靠RNG来确定每个节点的级别数(这是一个概率数据结构)。在跳过列表的开头插入/删除元素可以是O(1),而理论上最坏的情况是O(N)(每个节点的级别相同)。但是,当您考虑节点之间的级别分布时,摊销时间复杂度为O(log N)。