快速了解什么是跳跃表(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…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
