特点:有序,分值作为排序依据。
使用ziplist 或者 hashmap+skiplist 数据结构。
ziplist
对于有序数组可以使用二分法快速查找指定元素,如果是有序链表使用二分法时间复杂度增加。如果从链表中抽取一些数据 作为索引可以快速查找元素,时间复杂度为Log(n)
redis中 skiplist 数据结构
//节点结构
typedef struct zskiplistNode {
sds ele;//具体内容,字符串格式
double score;//分值
struct zskiplistNode *backward;//指向前一个节点的指针
struct zskiplistLevel {
struct zskiplistNode *forward; //指向下一个节点的指针
unsigned int span;//跨度
} level[]; //分层索引
} zskiplistNode;
//skiplist 结构
typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length; //节点个数
int level;//跳跃表层数
} zskiplist;
typedef struct zset {
dict *dict;
zskiplist *zsl;
} zset;
header 指向的节点属性不会被使用
level:表示层高
length:表示元素个数
BW:指向前一个节点的指针,用于逆序遍历
span:表示跨度。表示节点到同一层的下一个节点要跨过几个节点,用于计算排名
跳跃表代码实现
https://github.com/bobogu23/test/blob/master/src/test/java/algorith/linkedlist/SkipList.java