REDIS跳表(skiplist)

11 篇文章 0 订阅

一个跳表,应该具有以下特征:

  1. 一个跳表应该有几个层(level)组成;
  2. 跳表的第一层包含所有的元素;
  3. 每一层都是一个有序的链表;
  4. 如果元素x出现在第i层,则所有比i小的层都包含x;
跳表的插入过程如下;
 蓝色线表示查找插入位置的过程,红色的都要记录在一个update[]数组中(反序的方式来记录,即从最高的level开始),即level变化时就需要记录下来,主要是为了后续插入后更新跳表之间的指针用。
新插入节点的level根据一个随机函数(zslRandomLevel())来计算得到,这个随机函数根据幂次法则,幂次法则决定了 数值越大,函数生成它的几率就越小,即生成的level大部分都是比较小的。

如果新申请的node的level小于原来的level,则在 update[]数组中的记录如下图的数字(圆圈内);  然后根据新申请的node的level更新相应的指针;
即如果level只是2,则只用在update中更新update[0]和update[1]中保存的节点的指针, 即将新的node插入到update[]数组中的节点后面,并更新各个节点的span(即指针的跨越节点);如图中蓝色连线。



如果新申请的node的level大于原来的level,则在update[]数组中的记录如下图的数字(圆圈内),即新增的level也需要记录在update[]数组中;然后从0开始依次更新update[]数组中的指针和新申请的node指针, 即将新的node插入到update[]数组中的节点后面,并更新各个节点的span(即指针的跨越节点);如图中蓝色连线。



跳表删除节点比较简单,查找到相应的节点,并将查找过程记录在update[]数组中(和插入类似),然后将各个update的指针更新到删除节点的后续节点;判断头节点中的域是否有指向NULL的,如果有,则将level压缩。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值