什么是跳跃表?
一种有序的数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
时间复杂度?
平均O(logN)、最坏O(N),可以通过顺序性操作来批量处理节点
哪里用到了跳跃表?
实现有序集合键
在集群节点中用作内部数据结构
实现
//跳跃表节点
typedef struct zskiplistNode {
robj *obj;//成员对象,是一个指针,指向一个字符串对象,字符串对象保存着一个SDS值
double score;//分值,节点按各自保存的分值从小到大排列
struct zskiplistNode *backward;//后退指针,指向位于当前节点的前一个节点,在从表尾向表头遍历时使用
struct zskiplistLevel {
struct zskiplistNode *forward;//前进指针,用于访问位于表尾方向的其他节点
unsigned int span;//跨度,记录了前进指针所指向节点和当前节点的距离
} level[];//层
} zskiplistNode;
typedef struct zskiplist {
struct zskiplistNode *header, *tail;//指向跳跃表的表头节点和表尾节点
unsigned long length;//记录跳跃表的长度(节点的数量)
int level;//记录目前跳跃表内,层数最大的那个节点的层数
} zskiplist;
什么是排位?
在查找某个节点的过程中,将沿途访问过的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位