你了解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 或 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

冒泡排序和快速排序(分治递归算法)

冒泡排序&#xff1a; 冒泡排序时间复杂度为O&#xff08;N^2&#xff09; 直接插入排序比冒泡排序适应性更好&#xff0c;数据接近有序时比直接选择排序更好。 冒泡排序代码&#xff1a; void PrintArray(int* a, int n) {int i;for (i 0; i < n; i){printf("%d …

(详解版)创建线程的四种方式

文章目录 Java中创建线程的四种方式1. 继承Thread类并重写 run 方法来创建线程2. 实现Runnable接口并实现 run 方法来创建线程。3. 使用Callable接口创建线程4. 使用Executor框架创建线程 Java中创建线程的四种方式 接下来我会详细解释这四种方式创建线程如何实现. 我们如果要…

7000字详解ERP管理系统!

在当今竞争激烈的商业世界中&#xff0c;中小企业不仅需要保持灵活性&#xff0c;更需要高效管理企业资源。 你可能听说过ERP系统&#xff0c;但它究竟是什么&#xff1f;它为何成为中小企业管理的不二选择&#xff1f;又是如何助力中小企业整合资源、提升效率&#xff0c;并在…

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

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

Python3.5 中->,即横杠和箭头,用来表示函数的返回值类型

最近在看playwright的源码&#xff0c;在看sync_playwright()方法的源码时发现一个特殊的语法-> 即横杠箭头&#xff0c;跟据如下源码猜测它应该是一个说明函数返回值类型的标识&#xff0c;因为 -> PlaywrightContextManager 与return PlaywrightContextManager() 一致…

算法(2)——滑动窗口

前言&#xff1a; 步骤及算法模板&#xff1a; 确定两个指针变量&#xff0c;left0,right0; 进窗口&#xff1a; 判断&#xff1a; 出窗口 更新结果 接下来我们的所用滑动窗口解决问题都需要以上几个步骤。 一、长度最小的子数组 209. 长度最小的子数组 - 力扣&#xff08;L…

C语言-> 文件操作(函数满屏)

系列文章目录 前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青_C语言,数据结构,函数-CSDN博客 目的&#xff1a;学习文件操作&#xff0c;即…

Halcon深度学习方法

1、异常检测和全局上下文异常检测 图(1)异常检测示例 在图(1)上图中&#xff0c;异常检测示例&#xff1a;为输入图像的每个像素都分配一个分数&#xff0c;表明它显示未知特征(即异常)的可能性&#xff1b;在图(1)下图中&#xff0c;全局上下文异常检测示例&#xff1a;为输入…

Leetcode—859.亲密字符串【简单】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—859.亲密字符串 &#x1f4a9;山实现代码 class Solution { public:bool buddyStrings(string s, string goal) {int len1 s.size(), len2 goal.size();int cnt 0;int flag 0;int flag2 0;int odd -1;int a[26] …

Eclipse_01_如何设置代码文件背景颜色为护眼沙绿色

设置方法 Window --> Preference 参考文档 参考文档 1

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

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

全球首个AI监管法案出炉!

全球首个AI监管法案诞生了&#xff01; 今年来AI领域出现了爆发式的发展&#xff0c;在大模型的浪潮下&#xff0c;全球关于AI监管的讨论也越来越热。近日&#xff0c;经过长时间的讨论&#xff0c;欧洲议会、欧盟成员国和欧盟委员会三方签署了全球首份AI监管法案——《人工智…

关于Android studio新版本和NEW UI显示返回按钮的设置

1.新版Android studio问题 因为在新版本的Android Studio中&#xff0c;默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的&#xff0c;可以通过以下方法来实现返回上一步的功能&#xff1a; 在Android Studio的顶部菜单栏中&#xff0c;选择"View"。在…

[原创][R语言]股票分析实战[1]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

spring MVC概述和土门案例(无配置文件开发)

SpringMVC 1&#xff0c;SpringMVC概述2&#xff0c;SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器…

Spring MVC 原理(四)

Spring MVC 原理 Spring 的模型-视图-控制器&#xff08;MVC&#xff09;框架是围绕一个 DispatcherServlet 来设计的&#xff0c;这个 Servlet会把请求分发给各个处理器&#xff0c;并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等&#xff0c;甚至还能支持文…

还搞不懂虚短与虚断概念?虚断与虚断通俗讲解,几分钟带你搞定

在模拟电路 中&#xff0c;虚短和虚断是两个重要的概念&#xff0c;它们通常与运放电路 有关。这两个术语描述了运放电路中的一些重要现象&#xff0c;认识它们对 于 电子工程师 和电路设计师来说至关重要。本文将深入探讨虚短和虚断的含义&#xff0c;以及它们在电子电路中的应…

Java中线程状态的描述

多线程-基础方法的认识 截止目前线程的复习 Thread 类 创建Thread类的方法 继承Thread类,重写run方法实现Runnable接口,重写run方法使用匿名内部类继承Thread类,重写run方法使用匿名内部类实现Runnable接口,重写run方法使用Lambda表达式 run方法中的所有的代码是当前线程对…

LeetCode刷题---长度最小的子数组

要点&#xff1a;该题属于滑动窗口类型的题目 解法一&#xff1a;暴力破解法 使用两层for循环&#xff0c;i为起始位置&#xff0c;j为终止位置&#xff0c;每次j都要遍历到数组最后一个下标&#xff0c;并且逐个累加。当sum大于等于target时&#xff0c;比较获取最小的长度&am…

51单片机简易出租车计费系统仿真设计

51单片机简易出租车计费系统仿真设计( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus 8.9及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0036 1.主要功能&#xff1a; 出租车计费系统设计内容&#xff1a; 1、…