高级数据结构——跳跃表(Skip List)

什么是跳表?

跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。

跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。

跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。

在这里插入图片描述
如果要查找17这个元素,我们从二级索引的6开始,发现右边是15,还是小于7,于是进入一级索引,此时找到17元素。

只需要进行很少的比较就可以找到所需元素。

相当于是一个空间换时间的算法。

跳表查询、插入、删除的时间复杂度为O(log n)。

Redis底层选择使用跳表而不是红黑树呢?

首先,我们来分析下Redis的有序集合支持的操作:

  1. 插入元素
  2. 删除元素
  3. 查找元素
  4. 有序输出所有元素
  5. 查找区间内所有元素

其中,前4项红黑树都可以完成,且时间复杂度与跳表一致。

但是,最后一项,红黑树的效率就没有跳表高了。

在跳表中,要查找区间的元素,我们只要定位到两个区间端点在最低层级的位置,然后按顺序遍历元素就可以了,非常高效。

而红黑树只能定位到端点后,再从首位置开始每次都要查找后继节点,相对来说是比较耗时的。

此外,跳表实现起来很容易且易读,红黑树实现起来相对困难,所以Redis选择使用跳表来实现有序集合。

跳表索引层的随机提拔

跳表的设计者采用了一种有趣的办法:抛硬币。也就是随机决定新节点是否提拔,每向上提拔一层的几率是50%。因为跳跃表的删除和添加节点是不可预测的,很难用一种有效的算法来保证跳表的索引分部始终均匀。这种方法虽然不能保证索引绝对均匀分布。但是可以让大体趋于平均。

跳表和二叉查找树的区别

跳表的优点是维持结构平衡的成本很低,完全依靠随机。而二叉查找树在多次插入删除之后,需要Rebalance来重建平衡结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值