快速了解什么是跳跃表(skip list)
什么是跳跃表(skip list)
跳跃表(Skip List)是一种概率性的数据结构,它通过在多层链表的基础上添加“快速通道”来提高搜索效率。跳跃表的效率可以与平衡树相媲美,即在平均和最坏的情况下,查找和插入操作都可以在 O(logn) 的时间复杂度内完成,其中 n 是跳跃表中的元素数量。
跳跃表的工作原理:
- 多层链表:跳跃表包含多个层次,每个层次都是一个有序的链表。底层是完整的有序链表,包含所有的元素。每一层(除了底层)都是下面一层的一个“子集”,其中包含了选定的元素和指向这些元素的指针。
- 节点晋升:当在跳跃表中插入一个新元素时,这个元素首先被插入到底层链表中。然后,通过一种随机过程(例如抛硬币),决定这个元素是否“晋升”到上一层链表。这个过程可能会继续,导致元素可能会出现在多个层次中。
- 快速查找:查找元素时,从最高层开始,快速前进直到无法继续前进为止(因为下一个元素大于要查找的元素),然后下降到下一层继续查找。这样,可以跳过大量不需要的元素,从而加速查找过程。
为什么使用跳跃表?
跳跃表之所以有效,是因为它们利用了概率平衡来减少维护平衡所需的工作量,与平衡树相比,跳跃表在实现上更为简单,且不需要复杂的旋转操作。Redis选择使用跳跃表作为有序集合的一部分,是因为它们非常适合于实现范围查询和有序遍历,这些操作在有序集合中非常常见。
跳跃表与内存使用:
虽然跳跃表会使用多个层次来存储指向相同数据的指针,但由于这些指针指向的是相同的数据元素,所以元素的实际数据并不会被复制多份,因此并不会造成数据本身的重复存储。指针和层次结构是额外的开销,但这是为了获得在对数时间内执行搜索、插入和删除操作的能力。
举个例子:
1、多层链表:
想象一下,你有一串编号的盒子排成一行,每个盒子都代表一个元素,编号越大的盒子放在越后面。现在,如果你想找到特定编号的盒子,你可能需要从第一个盒子开始,一个接一个地查看,直到找到你要的盒子。
这就像跳跃表的底层链表:每个盒子都直接连接到下一个,你需要逐个检查。
现在,假设我们在这些盒子之上加了一层,这一层只包含一些选定的盒子,并且每个选中的盒子都有一个指针指向它在下一层的对应盒子。这些选中的盒子让你可以跳过那些没有被选中的盒子,因此如果你在上层找不到你要的盒子,你可以下降到底层继续寻找。
这相当于跳跃表的第二层,其中一些元素被“晋升”到了这一层。
继续这个过程,我们可以添加更多的层,每个层次比下面的层次包含更少的元素。在顶层,可能只有几个盒子。当你开始搜索时,你会从顶层开始,利用这些“快速通道”迅速逼近你的目标编号。一旦你在某一层上不能再接近目标了,你就下降到下一层继续搜索。这样,你可以快速跳过那些不相关的编号,直到找到你要的盒子。
在实际的跳跃表中,元素是否晋升到更高的层级是通过随机化过程决定的,这样可以保证结构的平衡,而不需要复杂的调整。
以下是一个形象的跳跃表示例:
层 3: 1 ------------------------------> 9层 2: 1 --------> 5 --------> 7 -------> 9层 1: 1 -> 3 -> 5 -> 6 -> 7 -> 8 -> 9
- 底层(层 1)含有所有元素(盒子)。
- 第二层(层 2)含有编号为 1, 5, 7, 9 的盒子,可以跳过 3、6、8。
- 第三层(层 3)只含有编号为 1 和 9 的盒子,提供了从开始到结束的快速通道。
如果你想找编号为 7 的盒子,从层 3 开始,发现你需要下降到层 2,因为层 3 里没有编号为 7 的盒子。
在层 2,你从 5 直接跳到 7,省去了检查 3 和 6 的需要。
这样,你就高效地找到了目标。
2、节点晋升
在跳跃表中,节点的晋升是通过随机化过程来实现的,以确保整个跳跃表的平衡。一个常见的方法是使用抛硬币的方式来决定一个节点是否晋升到上一层,这个方法称为“硬币翻转”(coin flipping)。
节点晋升过程的步骤如下:
- 插入节点:首先,新的节点被插入到跳跃表的最底层链表中。
- 抛硬币:然后,进行硬币翻转来决定这个节点是否晋升到上一层。硬币翻转是一个随机过程,通常是50%的概率来决定。
- 晋升节点:如果硬币翻转结果是正面(例如“头”),则节点晋升到下一个层级。
- 重复晋升:对晋升到新层级的节点再次进行硬币翻转,决定它是否继续晋升。这个过程重复进行,直到翻转结果为反面(例如“尾”)为止。
假设你正在插入一个新节点A,并且你已经将其插入到了底层链表中。现在,你开始进行硬币翻转:
- 第一次翻转:得到“头”,节点A晋升到第2层。
- 第二次翻转:再次得到“头”,节点A继续晋升到第3层。
- 第三次翻转:这次得到“尾”,晋升过程停止,节点A在第3层停留。
通过这个随机晋升的过程,跳跃表自然地形成了多层结构,顶层的节点数目会比底层少,这样就可以快速跳过大量的节点,提高搜索效率。
这个随机化的过程有助于跳跃表在没有任何调整的情况下保持平衡,因为晋升的过程并不依赖于具体的数值或插入的顺序,而是依赖于概率。这个过程保证了跳跃表的操作在平均情况下都是高效的。
需要深入了解点这里
-----------------------------------------------------------------我是分割线--------------------------------------------------------------
看完了觉得不错就点个赞或者评论下吧,感谢!!!
如果本文哪里有误随时可以提出了,收到会尽快更正的
相关文章:

快速了解什么是跳跃表(skip list)
什么是跳跃表(skip list) 跳跃表(Skip List)是一种概率性的数据结构,它通过在多层链表的基础上添加“快速通道”来提高搜索效率。跳跃表的效率可以与平衡树相媲美,即在平均和最坏的情况下,查找…...

【Node.js入门】1.1Node.js 简介
Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…...

数据库 高阶语句
目录 数据库 高阶语句 使用select 语句,用order by来对进行排序 区间判断查询和去重查询 如何对结果进行分组查询group by语句 limit 限制输出的结果记录,查看表中的指定行 通配符 设置别名:alias 简写就是 as 使用select 语句&#x…...

jenkins Java heap space
jenkins Java heap space,是内存不够。 两个解决方案: 一,修改配置文件 windows系统中,找到Jenkins的安装路径, 修改jenkins.xml 将 -Xmx256m 改为 -Xmx1024m 或者更大 重启jenkins服务。 二,jenkins增…...

OpenCV校准棋盘集合
棋盘格可以与相机校准工具一起使用,例如ROS的camera_calibration包。您可以通过单击下面的任何链接免费下载 PDF 格式的各种棋盘,没有水印或广告。此外,还添加了基于 JavaScript 的棋盘生成器,允许您生成自定义尺寸。 提示&#…...
使用git将本地项目推送到远程仓库github
总结:本地项目通过git上传到github 1)、在本地创建一个版本库(即文件夹),通过 git init 把它变成Git仓库; 2)、把项目复制到这个文件夹里面,再通过 git add . 把项目添加到仓库; 3)、再通过 gi…...

Mybatis-Plus使用Wrapper自定义SQL
文章目录 准备工作Mybatis-Plus使用Wrapper自定义SQL注意事项目录结构如下所示domain层Controller层Service层ServiceImplMapper层UserMapper.xml 结果如下所示:单表查询条件构造器单表查询,Mybatis-Plus使用Wrapper自定义SQL联表查询不用,My…...

仿mudou库one thread one loop式并发服务器
目录 1.实现目标 2.HTTP服务器 实现高性能服务器-Reactor模型 模块划分 SERVER模块: HTTP协议模块: 3.项目中的子功能 秒级定时任务实现 时间轮实现 正则库的简单使用 通⽤类型any类型的实现 4.SERVER服务器实现 日志宏的封装 缓冲区Buffer…...
二十三种设计模式全面解析-组合模式与装饰器模式的结合:实现动态功能扩展
在前文中,我们介绍了组合模式的基本原理和应用,以及它在构建对象结构中的价值和潜力。然而,组合模式的魅力远不止于此。在本文中,我们将继续探索组合模式的进阶应用,并展示它与其他设计模式的结合使用,以构…...

智慧城市建设解决方案分享【完整】
文章目录 第1章 前言第2章 智慧城市建设的背景2.1 智慧城市的发展现状2.2 智慧城市的发展趋势 第3章 智慧城市“十二五”规划要点3.1 国民经济和社会发展“十二五”规划要点3.2 “十二五”信息化发展规划要点 第4章 大数据:智慧城市的智慧引擎4.1 大数据技术—智慧城…...

unity - Blend Shape - 变形器 - 实践
文章目录 目的Blend Shape 逐顶点 多个混合思路Blender3Ds maxUnity 中使用Project 目的 拾遗,备份 Blend Shape 逐顶点 多个混合思路 blend shape 基于: vertex number, vertex sn 相同,才能正常混合、播放 也就是 vertex buffer 的顶点数…...

asp.net core mvc之路由
一、默认路由 (Startup.cs文件) routes.MapRoute(name: "default",template: "{controllerHome}/{actionIndex}/{id?}" ); 默认访问可以匹配到 https://localhost:44302/home/index/1 https://localhost:44302/home/index https:…...
前端设计模式之【访问者模式】
文章目录 前言介绍实现优缺点应用场景后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端设计模式 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&#…...

通过docker-compose部署elk日志系统,并使用springboot整合
ELK是一种强大的分布式日志管理解决方案,它由三个核心组件组成: Elasticsearch:作为分布式搜索和分析引擎,Elasticsearch能够快速地存储、搜索和分析大量的日志数据,帮助用户轻松地找到所需的信息。 Logstash…...

【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]
什么是机器学习中的特征提取? 特征提取是数据分析和机器学习中的基本概念,是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征,也称为变量或属性,是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…...

数据结构-单链表
1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 从以上图片可以看出: 1.链式结构在逻辑上是连续的,但在物理上不一定是连续的。 2.现实中的节…...

红队系列-IOT安全深入浅出
红队专题 设备安全概述物联网设备层次模型设备通信模型 渗透测试信息收集工具 实战分析漏洞切入点D-link 850L 未授权访问 2017 认证绕过认证绕过 D-link DCS-2530Ltenda 系列 路由器 前台未授权RTSP 服务未授权 访问 弱口令命令注入思科 路由器 固件二进制 漏洞 IoT漏洞-D-Lin…...

亚数受邀参加“长三角G60科创走廊量子密码应用创新联盟(中心)”启动仪式
11月8日,在第六届中国国际进口博览会2023长三角G60科创走廊高质量发展要素对接大会上,亚数信息科技(上海)有限公司CEO翟新元作为密码企业代表之一受邀参加“长三角G60科创走廊量子密码应用创新联盟(中心)”…...
直方图学习
直方图均衡化(Histogram Equalization)是一种用于增强图像对比度的图像处理技术,通过重新分配图像的像素值,使图像中的亮度级别更加均匀,以改善图像的视觉质量。下面是进行直方图均衡化的一般步骤: 计算原始…...

Java / Android 多线程和 synchroized 锁
s AsyncTask 在Android R中标注了废弃 synchronized 同步 Thread: thread.start() public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionali…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...