首页 > 其他分享 >跳跃表原理和实现

跳跃表原理和实现

时间:2022-12-08 13:04:27浏览次数:42  
标签:一层 实现 链表 插入 层数 跳跃 原理 节点

跳跃表原理和实现


前提


有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困惑,它允许快速查询一个有序连续元素的数据链表,它的效率可以做到和二分相同,都是O(logn)的平均时间复杂度,其空间复杂度为O(n)。

跳跃列表是在很多应用中有可能替代平衡树而作为实现方法的一种数据结构。跳跃列表的算法有同平衡树一样的渐进的预期时间边界,并且更简单、更快速和使用更少的空间。----by 发明者像是redis中有序集合就使用到了跳跃表。

原理


性质


首先,应该要了解跳跃表的性质;

  1. 由很多层结构组成;
  2. 每一层都是一个有序的链表,排列顺序为由高层到底层,都至少包含两个链表节点,分别是前面的head节点和后面的nil节点;
  3. 最底层的链表包含了所有的元素;
  4. 如果一个元素出现在某一层的链表中,那么在该层之下的链表也全都会出现(上一层的元素是当前层的元素的子集);
  5. 链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的同一个链表节点;

可以看到,这里一共有4层,最上面就是最高层(Level 3),最下面的层就是最底层(Level 0),然后每一列中的链表节点中的值都是相同的,用指针来连接着。跳跃表的层数跟结构中最高节点的高度相同。理想情况下,跳跃表结构中第一层中存在所有的节点,第二层只有一半的节点,而且是均匀间隔,第三层则存在1/4的节点,并且是均匀间隔的,以此类推,这样理想的层数就是logN。

搜索


其基本原理就是从最高层的链表节点开始,如果比当前节点要大和比当前层的下一个节点要小,那么则往下找,也就是和当前层的下一层的节点的下一个节点进行比较,以此类推,一直找到最底层的最后一个节点,如果找到则返回,反之则返回空。

代码实现大致为:

find(x)   
{
p = top;
while (1) {
while (p->next->key < x)
p = p->next;
if (p->down == NULL)
return p->next;
p = p->down;
}
}

插入


既然要插入,首先需要确定插入的层数,这里有不一样的方法。1. 看到一些博客写的是抛硬币,只要是正面就累加,直到遇见反面才停止,最后记录正面的次数并将其作为要添加新元素的层;2. 还有就是一些博客里面写的统计概率,先给定一个概率p,产生一个0到1之间的随机数,如果这个随机数小于p,则将高度加1,直到产生的随机数大于概率p才停止,根据给出的结论,当概率为1/2或者是1/4的时候,整体的性能会比较好(其实当p为1/2的时候,也就是抛硬币的方法)。

当确定好要插入的层数以后,则需要将元素都插入到从最底层到第k层。

删除


在各个层中找到包含指定值的节点,然后将节点从链表中删除即可,如果删除以后只剩下头尾两个节点,则删除这一层。

作者:​​sunsky303​​



标签:一层,实现,链表,插入,层数,跳跃,原理,节点
From: https://blog.51cto.com/u_15715098/5920970

相关文章

  • mysql group by 实现组内排序
    1、同一个分组中假如有三条数据,我们想要获取指定的第一条数据,作为查出来的数据2、第一步:通过时间排序,并将id拼接起来,截取第一个id,(也就是最新的一条id)selectSUBSTRING_......
  • redis实现消息消费确认(ack机制)
    前言消息中间件有很多,例如ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。这些消息系统都很专业,无论是可靠性,容错性,高性能都有自己独特的特点,那为什么我们还要用......
  • HashMap原理
    分享两篇博文:​​http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/​​......
  • C#实现多国语言的界面切换
    在PictureStudio中,我需要实现多国语言的界面切换,而且切换各种语言版本的时候希望程序是动态的加载语言,不希望切换语言后重新启动程序。实现这样的功能可以有很愚蠢的方法,比......
  • 【快应用】任意拖动图标实现案例
    ​ 问题背景:快应用页面开发阶段,ui布局时总是会遇到要在页面上实现一个可以任意拖动的导航栏,且在拖动时不能超出屏幕和导航栏不能在到边界时被压缩。一些开发者就会被困......
  • 实现湖南科技大学公众号自动健康打卡
    实现湖南科技大学公众号自动健康打卡本人一直在校基本没出过校门,所以健康打卡每日基本都是重复的但由于自己总是忘记打卡导致被打电话很是烦躁,于是编写了js脚本实现......
  • 基于云开发的答题活动小程序v2.0-排行榜页面用云开发能力实现查询答题成绩并进行排名
    项目技术栈微信原生小程序+云开发。我这里主要使用了云开发能力中的小程序端SDK,说白了就是在javascript中就能直接操作数据库。 本篇前言基于云开发的答题活动小程序......
  • 高压变频器控制系统中的PLC如何实现远程监控和编程调试?
    在大型冶金钢铁、石油化工、电力能源、采矿和市政供水等行业应用广泛的泵类设备,占据整个用电能耗系统的40%以上,一般采用高压变频器对各类泵设备进行速度控制。随着PLC控制技......
  • 内网穿透——Natapp实现
    转自:NATAPP使用教程(内网穿透)_Willing卡卡的博客-CSDN博客_natappNATAPP内网穿透使用教程        本文主要分享了有关内网穿透NATAPP的使用,包括:注册、建立隧道(免......
  • 批次iou计算np实现
    defiou(a,b):""":parama:4*M*1left,top,right,bottom:paramb:4*1*Nleft,top,right,bottom:return:"""aleft,atop,aright,abottom......