跳跃表(SkipList)

跳跃表是一种基于有序链表的数据结构,通过增加多级索引提高查询效率,实现O(logN)的时间复杂度。本文详细介绍了跳跃表的工作原理,包括查询、添加、删除操作的具体流程,以及与二叉查找树的区别。同时,探讨了跳跃表在Redis中的Sorted-set应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跳跃表在查询、添加、删除的时间复杂度上做到O(logN)

跳跃表(SkipList)是一种基于有序链表的扩展,简称跳表

 

思考:如何才能更快找到一个有序链表的某一节点

以上做法虽然增加了50%的额外空间,但是性能提高了一倍,此外还可以继续提取

当大量的新节点通过逐层比较,最终插入到原链表之后,上层的索引节点会渐渐变得不够用,所以需要考虑如何从新节点当中选取一部分提取到上一层(采用抛硬币的方式,随机决定新节点是否提拔,每向上提拔一层的几率是50%)

之所以使用抛硬币的方式,是因为跳跃表删除和添加的节点是不可预测的,很难用一种有效的算法来保证跳表的索引分布始终均匀

综上:跳跃表插入节点的流程有以下几步

1、新节点和各层索引节点逐一比较,确定原链表的插入位置。O(logN)

2、把索引插入到原链表。O(1)

3、利用抛硬币的随机方式,决定新节点是否提升为上一级索引。结果为“正”则提升并继续抛硬币,结果为“负”则停止。O(logN)

4、总体上,跳跃表插入操作的时间复杂度是O(logN),而这种数据结构所占空间是2N,既空间复杂度是 O(N)。

 

删除流程:

1、自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点。O(logN)

2、删除每一层查找到的节点,如果该层只剩下1个节点,删除整个一层(原链表除外)。O(logN)

3、总体上,跳跃表删除操作的时间复杂度是O(logN)。

 

 

跳跃表和二叉查找树的区别:

跳跃表维持结构平衡的成本比较低,完全依靠随机。而二叉查找树在多次插入删除后,徐亚Rebalance来重新调整结构平衡

 

应用:Redis中的Sorted-set

 

参考链接:

需要了解本文更详细内容的,请参考以下链接

http://blog.jobbole.com/111731/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值