Redis skiplists跳表

跳表是建立在普通有序链表之上的一种一种概率数据结构。可以理解为加了索引的有序链表。 

这里打个比方,假如把普通有序链表比作是普通公交车,因为每个公交站都停一下所以如果站比较多得时候肯定会很慢;那么跳表就相当于是特快大巴,它不会每个站都停,而是会跳过一些站点每隔几个站才停一下,显然特快大巴速度更快。

我们在一个有序链表中搜索一个元素的时候,即使链表已经排好序但是也不能使用二分查找法,必须挨个节点去遍历,算法复杂度是O(n),性能太低。而跳表就是为了解决这个问题, 它的搜索复杂度能达到O(log n),能够和红黑树相媲美。

跳表是在原始有序链表上构建一些索引层 ,索引层也是排好序的,每个索引层只包含一部分元素。之所以要加索引层是为了能使用二分查找原理来加速查找性能。下图是跳表的示意图,跳表每个结点不只包含一个指针,还可能包含若干个指向后继结点的指针,这样就可以跳过一些不必要的结点,从而加快查找、删除等操作。这些多出来的额外指针就是索引层。

 

标准跳表有以下几个特点:

  • keys是排好序的 
  • 包含n个元素的跳表层高是log n
  • 每个高层包含的元素数量是下层的1/2
  • 每层都有一个头节点和尾节点
  • 节点的大小是可变,包含1到log n个指针,每个节点具体包含几个指针是随机的

 查找

 

当查找k时:

  1. 如果 K = Key,搜素结束
  2. 如果 K < Next Key,进入下一层搜素
  3. 如果 K >= Next Key,往右到下一个节点

  现在来简单看一下跳表的搜索过程,我们要在下面这个跳表中查找71。这个跳表总共有四层链表,先从最高的索引层开始,每一层的末尾填充的是一个无限大的值。 

查找96:

 插入

 

 删除

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值