redis的跳表
typedef struct zskiplistNode {// 分值double score;// 成员对象robj *obj;// 后退指针struct zskiplistNode *backward;// 层struct zskiplistLevel {// 前进指针struct zskiplistNode *forward;// 跨度unsigned int span;} level[];
} zskiplistNode;
跳表的节点查找算法可以描述如下:
从跳表的头节点开始。
在当前层级上,从最右侧开始,逐个比较节点的值,直到找到一个节点的值大于或等于目标值。
如果当前节点的值等于目标值,则返回该节点,查找结束。
如果当前节点的值大于目标值,则向下移动到下一层级。
重复步骤2和3,直到找到目标节点或者到达跳表的底层。
跳表的插入算法描述如下:
随机生成层数。
插入新节点时,需要在每一层都更新对应的指针,使得新节点能够正确地插入到每一层中。