当前位置: 首页 > ai >正文

数据结构--跳表(Skip List)

1. 跳表是什么?

  • 跳表是一种基于链表的数据结构,它在普通有序链表的基础上加了一些“索引层”来加快查找效率。

  • 可以把它想象成:

    • 一楼 → 普通链表,节点挨个排好。

    • 二楼 → 在一楼的基础上,每隔几个节点抽一个“代表”建一条快速通道。

    • 三楼 → 再从二楼抽节点,建更快的通道。

  • 查找时,你先走“高速通道”(上层链表),当要找的数比当前大时往右走,比当前小或到头了就往下一层走,最后一定能到目标。

👉 直观类比:
就像在图书馆找书,普通链表是一本本翻,跳表相当于有“目录索引”,先快速缩小范围,再定位。


2. 跳表的特点

  1. 支持快速查找、插入、删除

    • 时间复杂度接近 O(log n)(和二叉搜索树、红黑树差不多)。

  2. 结构简单,容易实现

    • 相比红黑树,跳表代码更直观。

  3. 支持范围查询

    • 因为本质是链表,向后遍历特别方便(比树结构更好)。


3. 跳表的层级结构

  • 第0层(最底层): 普通有序链表,所有元素都在这里。

  • 第1层: 每隔 2 个元素抽一个“索引”。

  • 第2层: 每隔 4 个元素抽一个“索引”。

  • 第3层: 每隔 8 个元素抽一个“索引”。

  • 以此类推……

👉 每一层是下一层的“加速索引”。


4. 跳表的操作

4.1 查找

例子:找数字 8

  • 从最高层开始,从左往右走,直到下一个比 8大 → 向下一层。

  • 重复这个过程,直到走到最底层,找到 8。

👉 平均复杂度:O(log n)


4.2 插入

例子:插入 12

  1. 先按照查找方法,找到应该插入的位置(比如在 11和 13之间)。

  2. 把节点插入最底层链表。

  3. 用“随机算法”决定是否提升到上层索引。

    • 举个例子:掷硬币,正面就往上升一层,反面就停止。

    • 所以节点有可能只存在于底层,也可能出现在很多层。

👉 随机策略保证了层高分布,大多数节点只在底层,少数节点充当“高速索引”。


4.3 删除

  • 和查找类似,先找到目标节点。

  • 然后把它从各层链表里删除即可。


5. 跳表的时间复杂度

  • 查找:O(log n)

  • 插入:O(log n)

  • 删除:O(log n)

👉 这是因为跳表的层高大约是 log n 层,每层走几步就能下去。


6. 跳表的空间复杂度

  • 由于每层都要存索引,空间复杂度是 O(n)

  • 但因为索引是随机的,平均情况下不会太多。


7. 跳表的应用场景

  1. Redis 中的有序集合(Sorted Set,zset)

    • 内部就是用跳表实现的,可以快速完成范围查询和排序。

  2. 内存数据库 / 搜索引擎

    • 用来做索引,加速查找。


8. 跳表和其他结构对比

数据结构查找时间插入删除实现难度范围查询
有序链表O(n)O(1)简单简单
二叉搜索树O(log n)O(log n)较复杂较复杂
红黑树 / AVL树O(log n)O(log n)复杂较复杂
跳表O(log n)O(log n)简单简单

👉 跳表是 用链表实现了树的效果


9. 小结

  • 跳表是一个 带多级索引的有序链表

  • 通过“索引层”加快查找速度,平均复杂度 O(log n)。

  • 插入和删除时,用随机算法决定是否提升层级。

  • 应用非常广泛,特别是在 Redis Sorted Set 中。

http://www.xdnf.cn/news/19639.html

相关文章:

  • 【学Python自动化】 7. Python 输入与输出学习笔记
  • kaggle中的2D目标检测训练trick总结
  • 用了企业微信 AI 半年,这 5 个功能让我彻底告别重复劳动
  • 一文带你入门 AT 指令集:从串口通信到模块控制
  • 【智能体开发】怎样提升AI智能体的运行速度?
  • 实验2-代理模式和观察者模式设计
  • C++全局变量未初始的和已初始化的位置放在哪里?
  • C语言————实战项目“扫雷游戏”(完整代码)
  • 【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南
  • MD5加密算法详解与实现
  • 【LeetCode_26】删除有序数组中的重复项
  • 手撕Redis底层2-网络模型深度剖析
  • 云电脑是什么?与普通电脑的区别在哪里?——天翼云电脑体验推荐
  • 全国产FT-M6678核心板
  • SQL JOIN 操作全面解析
  • 哈希表-面试题01.02.判定是否互为字符重排-力扣(LeetCode)
  • 【LeetCode数据结构】栈和队列的应用
  • 在windows平台oracle 23ai 数据库上使用bbed
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • 【Vue2 ✨】 Vue2 入门之旅(六):指令与过滤器
  • 阿里云和华为云Rocky LINUX 9.X镜像就绪及低端可用英伟达GPU
  • Google NotebookLM最强替代品评测:AI笔记、语音生成与高效知识管理工具盘点
  • 【Linux基础知识系列:第一百一十八篇】使用perf进行性能分析
  • Day33 网络编程:OSI/TCP/IP模型、协议族与UDP编程
  • 【新启航】3D 逆向抄数的三维能力架构:数据采集工具操作 × 几何处理算法应用 × 行业场景适配技能
  • 微硕WINSOK大功率MOS管 WSF3085在汽车关键系统中的创新应用
  • 【世纪龙科技】汽车专业数字化课程资源包-虚拟仿真实训资源建设
  • 2025大学生必考互联网行业证书排名​
  • Nginx 全攻略:从部署到精通的实战指南(CentOS 环境)