展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 系统应用 > 数据结构与算法笔记-数据结构-跳表

数据结构与算法笔记-数据结构-跳表

[TOC]数据结构与算法笔记-数据结构-跳表跳表(skip list)跳表代码-gitee跳表代码-github关键词跳表是基于链表的一种动态数据结构,可以简单认为就是对链表的节点添加了多级索引.跳表支持快速地插入,删除,查找操作,时间复杂度都是O(logn),空间复杂度为O(n)跳表是通过添加索引

[TOC]

数据结构与算法笔记-数据结构-跳表

跳表(skip list)

跳表代码-gitee

跳表代码-github

关键词

  1. 跳表是基于链表的一种动态数据结构,可以简单认为就是对链表的节点添加了多级索引.
  2. 跳表支持快速地插入,删除,查找操作,时间复杂度都是O(logn),空间复杂度为O(n)
  3. 跳表是通过添加索引使用空间换时间的设计思路,构建多级索引来提升查询效率
  4. 跳表的时间复杂度为O(logn)
  5. 跳表数通过随机函数来维护平衡
  6. 跳表插入数据时要维护索引和节点的平衡,否则极端情况下可能会导致跳表退化成为链表
  7. 跳表更加灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗.
  8. 跳表有可与红黑树匹敌的性能,跳表写起来却好写很多.很多时候可以直接替代红黑树
  9. 按照区间来查找数据这个操作,红黑树的效率没有跳表高.对于按照区间查找数据这个操作,跳表可以做到,O(logn) 的时间复杂度定位区间的起点,而后在原始链表中顺序往后遍历即可

理解跳表

二分查找法底层依赖的时数组随机访问的特性,所以只能用数组来实现.

链表也有类似二分的查找操作, 叫做跳表(skip list)

链表可是个性能卓越的动态数据结构,它支持快速插入、删除和查找操作,而且编写起来也非常简单,甚至在某些情况下可以替代红黑树。

其中Redis的有序列表(sorted set)就是利用跳表来实现的,因为:

严格来说Redis还用到了Hash table
主要Redis手册,有序集合的核心操作就是
插入一个数据;
删除一个数据;
查找一个数据;
按照区间查找数据(比如查找值在[100, 356]之间的数据);
迭代输出有序序列。

其中,插入、删除、查找以及迭代输出有序序列这几个操作,红黑树也可以完成,时间复杂度跟跳表是一样的。但是,按照区间来查找数据这个操作,红黑树的效率没有跳表高。
对于按照区间查找数据这个操作,跳表可以做到 O(logn) 的时间复杂度定位区间的起点,然后在原始链表中顺序往后遍历就可以了
还有,跳表更加灵活,它可以通过改变索引构建策略,有效平衡执行效率和内存消耗。

单项链表的数据就算是有序的,要获取指定的数据也要从头逐个遍历,时间复杂度为O(n)

如图:

一级索引

想要提高查询效率,可以通过对链表建一级索引来实现.在每两个节点中提取一个节点到作为索引或索引层

如图: 下面的down代表下一个节点的指针

设若获取节点16:

  1. 首先遍历索引层,当遍历到索引层中值为13的节点时,发现其下一个节点是17,那么节点16必然位于这两个节点之间。

  2. 通过索引层及诶单的down指针,到原始接链表中继续向后遍历

  3. 此时,只需再向后遍历两个及诶单即可找到值等于16的节点

  4. 原来需要查找16次,现在只要7次遍历

可见, 加一层索引之后,查找一个节点需要遍历的次数就减少了很多,查找效率提升很高.

二级索引

和建立第一级索引的方式类似, 在第一级索引的基础上,每两个节点抽出一个节点到第二级作为二级索引.

此时再来查找16,只需要遍历6个节点.

如图:

当数据量够大,够大的时候, 查询效率会有更大的提升,下图一个64个节点的链表.建立了五级索引

要找到值为62的节点, 在没有索引时需要遍历62个节点.

现在只需要遍历11个节点即可

如图:

上面这种链表加多级索引的结构就是跳表 ,可以看到跳表大大减少了查询次数.对链表的优化是显而易见的.

跳表查询有多快

单项链表中查询指定数据的时间复杂度是O(n)

具有多级索引的跳表中, 假设有n个节点需要多少级索引:

设,若每两个节点抽出一个节点作为上一级索引

  1. 第一级索引约为n/2个
  2. 第二级索引约为n/4个
  3. 第三极索引约为n/8个
  4. 第四级索引约为n/16个
  5. ......以此类推
  6. 第k级索引的节点个数是k-1级索引的节点个数的1/2
  7. 第k级索引节点的个数就是n/(2^k)

设,索引有h级,最高级的索引有2个节点,

  1. 套用上面的公式得到n/(2^h)=2,求得h=log2n-1
  2. 如果包含原始链表这一层,整个跳表的高度就是log2n
  3. 在跳表查询某个数据时,若每一次都要遍历m个节点,那在跳表中查询一个数据的时间复杂度就是O(m*logn)

多级索引

如果每三个或五个抽出一个作为索引,如图有14个节点:

  1. 第一级索引需要n/3个节点
  2. 第二级索引需要n/9个节点
  3. ......每向上一级,索引的个数都除以3
  4. 假设做高级的索引个数为1, 把每级节点个数列出来,就是一个等比数列

通过等比数列求和公式, 总的索引结点大约就是 n/3+n/9+n/27+…+9+3+1=n/2

尽管空间复杂度还是 O(n),但比上面的每两个结点抽一个结点的索引构建方法,要减少了一半索引结点存储空间.

一般在真正的开发中,不考虑索引占的空间,索引结点只需要存储关键值和几个指针,并不需要存储对象.

高效的动态插入和删除

插入和删除实际上是需要两步的:

  1. 找到合适的节点
  2. 插入或删除

查找

跳表还支持动态插入,删除,切插入和删除的时间复杂度都是O(logn)

相比之下,单项链表的插入是O(1),但是这是在定好插入位置之后的时间复杂度.

但是为了保证链表数据的顺序性, 在插入之前还需要找到插入位置,查找一通这就费了劲了.

单向链表, 需要遍历每一个节点来找到插入的位置

插入操作

上面说过了, 跳表通过查找指定节点的时间复杂度是O(logn),找到插入位置也一样, 插入过程如下图:

删除操作

  1. 如果这个节点同时在索引中,想要删除原始链表中的节点,同时还要删除索引中的节点.

  2. 单项连表的删除操作需要拿到要该节点的前一个节点,然后通过指针来删除后一个节点,以完成删除该节点的操作.

  3. 所以在查找要删除的节点时,一定要获取到该节点的前一个节点.(双向链表不考虑这个问题)

跳表索引动态更新

在不断的插入数据而不去更新索引时,可能会出现两个索引之间节点数特别多的情况.

在极端情况下,会导致跳表退化成为链表.

如下图:

跳表作为一个动态数据结构,需要我们不断地维护索引与原始链表之间的平衡.

如果链表节点多了,索引节点就要增加,以避免复杂度退化,导致查找和删除性能下降.

红黑树和avl数是通过左右旋的方式保持左右子树的大小平衡,而跳表数通过随机函数来维护平衡.

通过随机函数,决定该节点插入到哪几级索引中,

如随机函数生成了值k,那就将这个节点添加到第一级到第K级的, 这几级的索引中

如下图:

随机函数要比较高,从概率上来讲要保证跳表的索引大小和数据大小平衡性,不至于性能过度退化.

总结

跳表的实现方式是很简单的,但是要特别注意的是随机函数的选择,

如果随机函数选择不当,会导致索引分配极不均衡.

极端情况下,跳表的一部分节点之间会退化为链表, 那就尴尬了.

插入

  1. 首先随机,得到要索引要补充的高度
  2. 从大到小循环,高度为上次得到的索引高度
  3. 循环数据,在上一步的循环中嵌套循环, 直到找到数据要插入的位置或者查到了链表的最后
  4. 找到位置后,将该位置后面的节点取出,将当前要插入的节点的下一个指针标记为该节点.
  5. 将该位置的前一个节点的下一个节点的指针修改为当前节点
  6. 插入完成

删除

查找

删除和查找流程类似, 不再赘述.

本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
系统应用
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

Mac软件 更多
photoshop
photoshop

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Mac
WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Mac
Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。