跳跃表

it2023-09-06  82

特点

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。

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

最新回复(0)