Redis数据结构之SkipList
传统链表和跳表
首先跳表是一个链表,但是跳表在传统链表的基础上增加了类似索引的层级指针,是用空间换时间的数据结构;
传统链表的,查询时间复杂度是O(n),因为只能一个一个往下找,而跳表顾名思义可以跳着查找,从而加快查找效率;
像这样的层级指针最多可以有32层,效率和红黑树差不多;
SkipList结构
- 链表结构
typedef struct zskiplist {
//头尾节点指针
struct zskiplistNode *header, *tail;l
/节点数量
unsigned long length;
//最大的索引层级,默认是1
int level;
}zskiplist;
- 节点结构
typedef struct zskiplistNode {
sds ele; //节点存储的值
double score; //节点分数,排序、查找用
struct zskiplistNode *backward; //前一个节点指针
struct zskiplistLevel {
struct zskiplistNode *forward; //下一个节点指针
unsigned long span; //索引跨度
} leve[]; //多级索引数组
}zskiplistNode ;
SkipList的特点:
- 跳跃表是一个双向链表,每个节点都包含score和ele值
- 节点按照score值排序,score值一样则按照ele字典排序b
- 每个节点都可以包含多层指针,层数是1到32之间的随机数
- 不同层指针到下一个节点的跨度不同,层级越高,跨度越大
- 增删改查效率与红黑树基本一致,实现却更简单