博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构与算法】什么是跳表?通俗易懂来理解跳表
阅读量:1886 次
发布时间:2019-04-26

本文共 911 字,大约阅读时间需要 3 分钟。

跳表

背景

一个有序链表搜索、添加、删除丶平均时间复杂度是多少?

O(n)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3JYSJVr-1617526278668)(imgs/1.png)]

那么我们能否利用向数组二分搜索优化有序链表,使其搜索、添加、删除的平均时间复杂度降低至O(logn)?

但很明显的是链表没有像数组那样的高效随机访问(O(1)时间复杂度),所以不能像有序数组那样直接进行二分搜索优化

那么有没有其他办法让有序链表搜索、添加、删除的平均时间复杂度降低至O(logn)?

答案是使用跳表(SkipList)

跳表(SkipList)

跳表,又叫做跳跃表,在有序链表的基础上增加了“跳跃”的功能;

由William Pugh于1990年发布,设计的初衷是为了取代平衡树(比如红黑树);

Redi中的SortedSet、LevelDB中的MemTable都用到了跳表;

Redis、LevelDB都是著名的key-value数据库;

对比平衡树

  • 跳表的实现和维护会更加简单;
  • 跳表的搜索、删除、添加的平均时间复杂度都是O(logn)

使用跳表优化链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6MfUwcp-1617526278672)(imgs\2.png)]

1.跳表的搜索

  • 从顶层链表的首元素开始,从左往右开始搜索,直至找到一个大于或等于目标的元素,或者到达当前层的的尾部;
  • 如果该元素等于目标元素,则表明该元素已找到;
  • 如果该元素大于目标元素或者已到达链表的尾部,则退回到当前层的前一个元素,然后转入下一层进行搜索

2.跳表的添加、删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xi5sUybQ-1617526278673)(imgs\3.png)]

  • 添加的细节
    • 随即决定新添加元素的层数
  • 删除的细节
    • 删除一个元素之后,整个调表的层数可能会降低

3.跳表的层数

  • 跳表是按层构造的,底层是一个普通的有序链表,高层相当于是低层的”快速通道“

  • 在第i层中的元素按某个固定的概率p出现在第i+1层中,产生越高的层数,概率越低;

    • 元素层数恰好等于1的概率为1-p;
    • 元素层数大于等于2的概率为p,而元素层数恰好等于2的概率为p*(1-p)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITEiJbOc-1617526278677)(imgs\4.png)]

4.跳表的时间复杂度

每一层的元素个数

  • 第1层链表固定有n个元素;
  • 第2层链表平均有n*p个元素;
  • 第3层链表平均有n*p^2个元素;
  • 第k层链表平均有n*p^k个元素;

另外:

表固定有n个元素;

  • 第2层链表平均有n*p个元素;
  • 第3层链表平均有n*p^2个元素;
  • 第k层链表平均有n*p^k个元素;

另外:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lto4PNNx-1617526278678)(imgs\5.png)]

转载地址:http://ccwdf.baihongyu.com/

你可能感兴趣的文章
ROS把pkg1下的某个头文件和源文件生成动态链接库供pkg2调用
查看>>
使用urdf_tutorial快速可视化urdf文件
查看>>
SQl 数据完整性(随堂博客)
查看>>
左连接、右连接、内连接
查看>>
MySQL DQL语句基础(随堂博客)
查看>>
利用MySQL进行数据复杂查询(1)
查看>>
MySQL 表与表之间的关系
查看>>
pymysql 的基础应用
查看>>
Python 管理程序改进——连接MYSQL
查看>>
Python 爬虫-豆瓣影星图片下载
查看>>
网页端数据库操作界面—主题函数文件
查看>>
网页端数据库操作界面-Html页面(1)
查看>>
Python爬虫 百度热搜热点
查看>>
excel的常用函数(二)
查看>>
excel文本函数
查看>>
阿里云ECS服务器-Windows Server 2012 R2/2016/2019无法安装.NET Framework 3.5.1或语言包的解决方法
查看>>
编程程软件测试思维方式:如何科学制定测试计划
查看>>
BLE蓝牙4.0串口调试助手
查看>>
树莓派WIFI设置
查看>>
在树莓派上安装GUI的FreeRadius(Raspberry PI based FreeRadius Server with GUI)
查看>>