数据结构-跳表
数据结构
/* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode { sds ele; double score; struct zskiplistNode *backward; struct zskiplistLevel { struct zskiplistNode *forward; unsigned long span; } level[]; } zskiplistNode; typedef struct zskiplist { struct zskiplistNode *header, *tail; unsigned long length; int level; } zskiplist; typedef struct zset { dict *dict; zskiplist *zsl; } zset;
- score:分值,用于排序。
- backward:是第一层的前一个数据,即span=1。
- level[]:每一个层所代表的节点node。
- forward:该层级的下一个节点。
- span:到达该层级的下一个节点,实际跨越了多少个节点,也是方便用于zrange等排行榜查询的用处。
有序链表只能逐一查找元素,导致操作起来非常缓慢,于是就出现了跳表。具体来说,跳表在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位,如下图所示:
跳表性质
- 由很多层组成
- 每一层都是一个有序链表
- 最底层的链表包含所有元素
- 如果一个元素出现在第i层的链表中,则它在i-1层中也会出现。
- 上层节点可以跳转到下层。
跳表的查找、插入复杂度就是 O(logN)。