你了解Redis中的跳跃表吗?

news2024/11/18 23:34:50

跳跃表的基本内容:

对于一个有序序列,链表相对于数组来说,删除和插入的效率要快很多,只需要改变指针的指向,但是在查找的时候,数组就要更占优势一些,可以随机访问,然而链表需要从头开始遍历,最坏的情况下可能达到了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 或 false
       while(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.coloradmin.cn/o/1322479.html

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

相关文章

连接SSH报错 / 连接容器SSH

连接SSH报错 / 连接容器SSH 前言被控端主控端连接失败 前言 本文介绍如何通过SSH方式远程连接Linux被控端&#xff0c;并介绍如何解决连接失败问题。 此方法同样适用于SSH连接Docker容器。 被控端 被控端一般为Linux&#xff0c;默认已安装ssh&#xff0c;但需要手动安装ope…

C++ OJ题测试—排序算法效率

目录 OJ链接 一、直接插入排序 二、希尔排序 三、直接选择排序 常规&#xff1a; 第二种&#xff1a; 四、 堆排序 五、冒泡排序 六、快速排序 常规&#xff1a; 三路划分优化效率 七、归并排序 八、计数排序 OJ链接 ​ 一、直接插入排序 class Solution { pub…

Gateway No servers available for service

springCloud集成网关测试报错找不到服务&#xff0c;如下 造成这种错误可能是下面两种原因 1、nacos注册的服务不在一个命名空间内&#xff0c;导致找不到服务503 spring cloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848file-extensio…

探索Qt 6.3:了解基本知识点和新特性

学习目标&#xff1a; 理解Qt6.3的基本概念和框架&#xff1a;解释Qt是什么&#xff0c;它的核心思想和设计原则。学会安装和配置Qt6.3开发环境&#xff1a;提供详细的步骤&#xff0c;让读者能够顺利安装和配置Qt6.3的开发环境。掌握Qt6.3的基本编程技巧&#xff1a;介绍Qt6.…

欧洲版OpenAI疑似将在24年发布并开源GPT-4级别模型!

大家好&#xff0c;我是二狗。 今天在推特上看到一条振奋人心的消息&#xff1a; “ 欧洲版OpenAI、法国初创公司 Mistral 首席执行官 Arthur Mensch 在法国国家广播电台宣布&#xff0c;Mistral 将在 2024 年发布开源 GPT-4 级别模型。” 这位老哥接着表示甚至可能是免费的&a…

C++ STL——栈和队列(stack queue)

本节目标 1.stack的介绍和使用及其模拟实现 2.queue的介绍和使用及其模拟实现 3.priority_queue的介绍和使用及其模拟实现 4.容器适配器 1.stack的介绍和使用及其模拟实现 1.1 stack的介绍 stack的文档介绍 根据stack的文档介绍可以知道&#xff0c;stack是一种容器适配器…

原生微信小程序-使用 阿里字体图标 详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…

结果实例: 一个cpu的parsec结果

简介 限于篇幅限制&#xff0c;很多教程和论文只展示部分结果。我们这里展示非常细节的结果&#xff0c;包括输出的许多命令行结果。 运行命令行 的shell窗口 ./build/X86/gem5.opt -d m5out/onlyoneCPUkvmCheckPointDifferRCS20231218restore \configs/deprecated/example/…

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式&#xff0c;一直没有怎么深入了解&#xff0c;最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能&#xff0c;在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备&#xff1a;另起一台新服务器&#xff0c;并配置docker yum源&#xff0c;安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…

Home Assistant 如何开启SSH服务

环境&#xff1a; Home Assistant 11.2 SSH & Web Terminal 17.0 问题描述&#xff1a; Home Assistant 如何开启SSH服务 解决方案&#xff1a; 通过添加一个名为Terminal & SSH的插件来在 Home Assistant 中启用 SSH 服务 下面是启用 SSH 服务的大致步骤&#x…

C语言数据结构-排序

文章目录 1 排序的概念及运用1.1 排序的概念1.2 排序的应用 2 插入排序2.1 直接插入排序2.2 希尔排序2.3 直接排序和希尔排序对比 3 选择排序3.1 堆排序3.2 直接选择排序 4 交换排序4.1 冒泡排序4.2 快速排序4.2.1 挖坑法14.2.2 挖坑法24.2.3 挖坑法3 5 并归排序6 十万级别数据…

Ubuntu中基础命令使用

前言 以下指令测试来自于Ubuntu18.04 如果有说的不对的&#xff0c;欢迎指正与补充 以下指令为我学习嵌入式开发中使用过最多的指令 目录 前言 1 ls 首先我们进入到Linux操作系统中 2 touch创建一个文件 3 pwd查看当前路径 4 创建目录 5 删除文件 6 cd 目录跳转 0…

LVS负载均衡集群之HA高可用模式

Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 一个合格的集群应该具备的特性&#xff1a; 1.负载均衡 LVS Nginx HAProxy F5 2.健康检查&#xff08;探针&#xff09; for调度器/节点服务器 Keeplived Hearbeat 3.故障转移 通过VIP飘逸实现主备切换 健康检查&am…

HarmonyOS 中DatePicker先择时间 路由跳转并传值到其它页

效果 代码 代码里有TextTimerController 这一种例用方法较怪&#xff0c;Text ,Button Datepicker 的使用。 import router from ohos.router’则是引入路由模块。 import router from ohos.router Entry Component struct TextnewClock {textTimerController: TextTimerContr…

【马来西亚会议】第四届计算机技术与全媒介融合设计国际学术会议(CTMCD 2024)

第四届计算机技术与全媒介融合设计国际学术会议&#xff08;CTMCD 2024) 2023 4th International Conference on Computer Technology and Media Convergence Design 第四届计算机技术与全媒介融合设计国际学术会议&#xff08;CTMCD 2024&#xff09;将于 2024年2月23日-25日…

计算机组成原理(存储器与CPU的连接)

题目&#xff1a; 设 CPU 共有 16 根地址线。8 根数据线&#xff0c;并用 作访存控制信号&#xff0c;R/作读/写命令信号。现有这些存储芯片:ROM (2K*8 位、4K*4 位、8K*8 位)&#xff0c;RAM(1K*4 位、2K*8 位、4K*8 位)及 74138 译码器和其他门电路(门电路自定)。试从上述规…

XAgent的部署及运行

源代码clone git clone config 文件的修改 在XAgent源码目录&#xff0c;运行 vi .env&#xff0c; 修改以下配置条目 CONFIG_FILEassets/gpt-3.5-turbo_config.ymlpython环境 python >3.10 安装conda&#xff0c;通过conda激活python3.10的环境 wget https://repo.a…

Nodejs 第二十五章(http)

“http” 模块是 Node.js 中用于创建和处理 HTTP 服务器和客户端的核心模块。它使得构建基于 HTTP 协议的应用程序变得更加简单和灵活。 创建 Web 服务器&#xff1a;你可以使用 “http” 模块创建一个 HTTP 服务器&#xff0c;用于提供 Web 应用程序或网站。通过监听特定的端…

智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑猩猩算法4.实验参数设定5.算法结果6.参考文…