跳跃表

特点

1,每个节点多个指针
2,有序链表
3,基本平衡,平均logn

使用

只有zset使用了
还有集群的内部实现

实现

typedef struct zskipListNode {
struct zskipListNode *backward; //反向指针,前一个node
double score;//排序的依据,zset的score
robj *obj;//sds字符串, zset的key,当score一样的时候根据key排序

struct zskipListLevel {
struct zskipListNode *forward;//正向,下一个指针
unsigned int span;//跨度
} []level;
};

typedef zskiplist struct {
zskiplist struct *head, *tail;
unsigned long lenth;//节点数量
int level;//最大节点层数
}

1,level数组的长度是根据幂次定律生成的1-32之间的随机数,并且越大的数出现的概率越小。由于是直接分配在结构体的,可以通过sizeof计算出该层的level数量
2,前进/后退指针
backward和forward(span为1的level)就是双向链表,后退指针在zrevrange的时候很有用

插入删除

对于插入,很显然l1是必须要插入对, l2要插入对概率为1/2, l3要插入的概率为1/4,ln插入的概率是1/2**n,这样就能保持下一层是上一层个数的1/2。

对于删除,找到该节点,在查找的过程中,其实就能找出每一层的每一层的前一个节点。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页