【发布时间】:2016-05-18 09:11:45
【问题描述】:
Redis zrank.
返回存储在 key 的有序集合中成员的排名,分数从低到高排序。排名(或索引)是从 0 开始的,这意味着得分最低的成员排名为 0。
为什么复杂度是 O(log(N))?成员是按分数排序的,而zrank是按成员查询的。
更新
我找到了可能是答案的东西。
A.当zset被ziplist实现时
- 大小小于128
- 每个成员的大小小于 64 字节。
所以,ziplist的大小很小,所以不是我讨论的问题。
B.当zset由skiplist实现时 zset的实现是:
typedef struct zset {
zskiplist *zsl;
dict *dict;
} zset;
zset同时保存一个dict和一个skiplist。
-
dict保持成员与分数的映射。 -
zsl是按分数排序的对象的排序列表。该对象同时包含成员和分数。
所以,zrank 是这样的:
使用 O(1) 时间查找成员的分数。如果没有找到,返回
nil。用找到的分数在
zsl中搜索,花费O(log(N))时间。
【问题讨论】:
-
你说使用从zsl找到的分数搜索,花费O(log(N))时间。,但你只能找到你想要的成员,但你可以'不知道它的等级是什么。
-
@JasonLaw 在 skiplist 的节点中,每个级别都有一个跨度(int)。它将在搜索处理过程中累积。详见:zslGetRank in github.com/antirez/redis/blob/unstable/src/t_zset.c