你了解Redis中的跳跃表吗?

跳跃表的基本内容:

对于一个有序序列,链表相对于数组来说,删除和插入的效率要快很多,只需要改变指针的指向,但是在查找的时候,数组就要更占优势一些,可以随机访问,然而链表需要从头开始遍历,最坏的情况下可能达到了O(n),为了改变链表的这一弊端,人们就想出了利用空间换时间的策略,尝试给链表加个索引,假设我们当前有如下所示的普通链表:

我们要查找18需要比较8次

在这里插入图片描述
但如果如下所示我们给当前链表添加一层索引,那么只需要比较5次

在这里插入图片描述

如果我们给当前链表添加两层索引(如下所示),那么只需要比较4次

在这里插入图片描述

跳表的第一层存储的是所有的元素每个节点存在两个指针指向后继节点下一层的节点查找的时候从最高层开始逐层比较直到第一层

在这里插入图片描述

对于跳跃表来说,假设我们现在想要插入数据我们不但要在链表中插入数据还要去更新索引,如果直接插入数据而不更新索引,那么很有可能出现两个索引之间存在大量的数据,同时也失去了创建索引的意义,那么要如何更新索引呢?

上层节点个数应该是下层节点个数的二分之一,因此我们希望这个新节点添加到上一层的概率是二分之一,最简单的方式就是抛硬币,因为正反面的概率都是二分之一,所以我们只要让它在0和1之间随机,如果是0就停止,如果是1就继续,最后出现的次数k,就代表我们需要在第一层到第k层之间添加索引,当然我们也不能让它无限增长,所以我们还需要添加一个最大值的限制

public int getRandom(){int k=1;Random random=new Random();//random.nextBoolean()返回一个随机的 boolean 值,即 true 或 falsewhile(random.nextBoolean()&&k<MAX_VALUE){k++;}return k;
}

跳跃表的增删改查:

比如我们添加一个节点为13,随机值为2

在这里插入图片描述

那么我们只需要在第一层和第二层加入13即可

在这里插入图片描述

删除操作就比较简单了,直接将我们节点和跨越的层数删除即可

在这里插入图片描述

时间复杂度:

在这里插入图片描述

第一层的索引节点数为n个,第二层为n/2个,那么第K层的索引节点数为在这里插入图片描述

注意:当某层的索引节点只有两个时,我们就不增加索引了

在这里插入图片描述

下述中的2为当索引个数为2时,我们就不再添加索引了,h为跳跃表的高度

在这里插入图片描述

如果我们每一层要遍历X个节点,那么在跳表中查找的时间复杂度就为O(Xlogn),可认为O(logn)

由于插入和删除的时间复杂度都是O(1),时间主要花费在查找元素的位置,所以插入和删除的时间复杂度都为O(logn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第51次中国互联网络发展状况统计报告

3月2日&#xff0c;中国互联网络信息中心&#xff08;CNNIC&#xff09;在京发布第51次《中国互联网络发展状况统计报告》&#xff08;以下简称&#xff1a;《报告》&#xff09;。《报告》显示&#xff0c;截至2022年12月&#xff0c;我国网民规模达10.67亿&#xff0c;较2021…

SGML .HTML 、XML和XHTML的区别?

SGML&#xff08;Standard Generalized Markup Language&#xff09;是一种标记语言的元语言&#xff0c;它定义了用于创建其他标记语言的规范。 HTML&#xff08;Hypertext Markup Language&#xff09;是基于SGML的标记语言&#xff0c;用于创建网页。 XML&#xff08;eXte…

oracle与gbase8s迁移数据类型对照

声明&#xff1a;以下为笔者阅读gbase官方文档和oracle官方文档的理解&#xff0c;如有错误&#xff0c;敬请指正。oracle与gbase8s迁移数据类型对照及举例说明 最终结论&#xff1a;oracle与gbase8s数据类型对应关系关于单精度与双精度的区别关于定点与浮点定义的区别精度的定…

动态规划 - 1137.第N个泰波那契数(C#和C实现)

动态规划 - 1137.第N个泰波那契数(C#和C实现) 题目描述 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1&#xff0c;且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2。给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1: 输入&#xff1a;n 4 输出…

[报错已解决]得到一个不期待的值added_cond_kwargs,图生图和文生图的pipline是不同的

报错内容 得到一个不期待的值added_cond_kwargs 问题原因 对照下图&#xff0c;做测试unet_2d_condition.py里面UNet2dConditionModel类的forward输入 而StableDiffusionPipline&#xff08;文生图t2i&#xff09;的self.unet输入里面多了一个added_cond_kwargs需要写 从下图可…

函数torch.bincount( )的用法

torch.bincount()函数是PyTorch中的一个函数&#xff0c;用于计算一维整数张量中每个非负整数值出现的频次 函数的用法 &#xff1a; torch.bincount(input, weightsNone, minlength0) → Tensor 参数&#xff1a; input&#xff1a;输入的一维整数张量weights&#xff08;…

JsonNode、ObjectNode和ArrayNode

我个人不喜欢fastjson&#xff0c;但是项目中很多地方用到json字符串转换对象但又不想创建pojo 所以使用jackson的JsonNode、ObjectNode和ArrayNode就非常好用&#xff0c;万能对象&#xff0c;这三 个对象是非常全面的&#xff0c;感兴趣的可以看下源码 JsonNode 只读&#x…

机器学习——支持向量机

目录 一、基于最大间隔分隔数据 二、寻找最大间隔 1. 最大间隔 2. 拉格朗日乘子法 3. 对偶问题 三、SMO高效优化算法 四、软间隔 五、SMO算法实现 1. 简化版SMO算法 2. 完整版SMO算法 3. 可视化决策结果 六、核函数 1. 线性不可分——高维可分 2. 核函数 …

【大数据面试】MapReduce常见问题与答案

目录 介绍下MapReduce MapReduce优缺点 MapReduce架构 MapReduce工作原理 MapReduce哪个阶段最费时间 ✅MapReduce中的Combine是干嘛的?有什么好出? ✅MapReduce环形缓冲区是什么 ✅MapReduce为什么一定要有环型缓冲区 MapReduce为什么一定要有Shuffle过程 MapRedu…

Autosar通信实战系列08-Com模块相关开发问题总结

本文框架 前言1. Com模块重要接口回顾2. 如何让通过Com模块配置改善发送报文周期不准问题?3. UDS 0x28服务关闭或打开APP报文与Com模块的交互?4. 如何在Com层实现接收报文的超时,ARC及信号有效性监控?4.1 信号超时监控的配置4.2 报文ARC校验4.3 报文信号值有效性校验前言 …

linux命令绕过

WAF绕过命令执行 1 命令分隔符2 命令执行绕过2.1 绕过空格2.2 拼接2.3 编码2.4 单引号、双引号绕过2.5 反斜线绕过2.6 通配符绕过 1 命令分隔符 linux&#xff1a; && || & | ; # &&绕过 [rootlocalhost ~]# echo 123&& cat /etc/passwd 123 root:…

拾壹[11],缩放形状匹配,函数CreateScaledShapeModel/FindScaledShapeModel

函数CreateScaledShapeModel 函数功能 创建可缩放比例的形状匹配模板 C形式 LIntExport void CreateScaledShapeModel( const HObject& Template, const HTuple& NumLevels, const HTuple& AngleStart, const HTuple& AngleExtent, const HTuple& …

设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

原型模式 原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。 原型模式是一种创建型设计模式&#xff0c;允许一个对象再创建另外一个可定制的对象&#xff0c;无需知道如何创建的细节。 工作原…

threejs 内置变量函数

参考glsl文档 threejs 内置变量 vertex shader highp vec4 gl_PointSize 点大小mediump float gl_Position 不用多说 fragment shader mediump vec4 gl_FragCoord 屏幕坐标系bool gl_FrontFacingmediump vec4 gl_FragColor 最重要的mediump vec4 gl_FragData[gl_MaxDrawBu…

新年跨年烟花超酷炫合集【内含十八个烟花酷炫效果源码】

❤️以下展示为全部烟花特效效果 ❤️下方仅展示部分代码 ❤️源码获取见文末 🎀HTML5烟花喷泉 <style> * {padding:0;margin:0; } html,body {positi

清华提出ViLa,揭秘 GPT-4V 在机器人视觉规划中的潜力

人类在面对简洁的语言指令时&#xff0c;可以根据上下文进行一连串的操作。对于“拿一罐可乐”的指令&#xff0c;若可乐近在眼前&#xff0c;下意识的反应会是迅速去拿&#xff1b;而当没看到可乐时&#xff0c;人们会主动去冰箱或储物柜中寻找。这种自适应的能力源于对场景的…

springboot的配置文件,以及spring boot自动装配的原理,bean的管理。

配置优先级&#xff1a; spring boot中自此三种格式的配置文件&#xff1a; server.port&#xff1a;8081 server.port&#xff1a;8082 server.port&#xff1a;8083 spring boot还支持两种外部配置&#xff1a; java系统属性&#x…

软件测试人才稀缺!揭秘为什么你找不到软件测试工作?

最近后台很多粉丝给我留言&#xff1a; 2023年软件测试已经崩盘了吗&#xff0c;为什么都找不到工作了&#xff1f; 确实&#xff0c;今年经济大环境不好&#xff0c;企业也都在降本增效&#xff0c;如果技术能力还在被应届生竞争岗位的阶段&#xff0c;只会越来越难。 找不…

【大数据面试】YARN常见问题与答案

目录 介绍下YARN YARN有几个模块 YARN工作机制 YARN有什么优势&#xff0c;能解决什么问题? YARN容错机制 YARN高可用 YARN调度器 YARN中Container是如何启动的? YARN的改进之处&#xff0c;Hadoop3.x相对于Hadoop 2.x? YARN监控 介绍下YARN YARN有几个模块 Yar…

74.搜索二维矩阵

题目 法1&#xff1a;二分搜索 剑指原题 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int i 0, j n - 1;while (i < m && j > 0) {if (matrix[i][j] target) {return true;} el…