跳表是一种什么样的数据结构

跳表是有序集合的底层数据结构,它其实是链表的一种进化体。正常链表是一个接着一个用指针连起来的,但这样查找效率低只有O(n),为了解决这个问题,提出了跳表,实际上就是增加了高级索引。朴素的跳表指针是单向的并且元素值不能重复,redis对其进行了修改,回退指针的作用是支持反向遍历。
在这里插入图片描述
具体查找过程,假设查45,那从5的二级索引一下跳到35,发现还没找到,再跳到55。发现超了,那用一级索引试试,结果找到了,那ok了。需要注意,使用高级索引时候底层源码实现时候还有一个对于步长的记录,也就是5->35用二级索引记录了步长3

插入的话,不会影响当前表中节点的层高,因为节点被创建时和层高就已经确定了(当然可能会修改插入位置前后结点的关联指针,这是链表必然的)。
那一个节点层高如何确定?
这是在插入时候确定的,默认每个节点一开始默认的是1层(一级索引都没有),每次以25%概率增加1层(5.0.5版本最高为64层)。不用一个层高数量的比例是因为不想刻意维护这种比例关系,导致额外开销。

跳表的平均性能能达到O(logn),并且由于表头有定义查询有序集合元素总数时仅需O(1)

那么为啥redis不用b+树呢?
因为b+树是更多用于磁盘io的,其可以降低磁盘io次数。redis是内存中的,所以b+树这扁平特性没那么重要了,并且跳表实现起来简单,也不用考虑在中间位置插入后保持平衡的操作。
同样的问题,为啥不用红黑树?
其实就是因为跳表实现简单,占用内存少(层高概率25%是可以调的,层高越大占用内存越多,折中选择),并且查询性能和局部性不比红黑树差

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

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

相关文章

Linux网络编程(三-UDP协议)

目录 一、UDP概述 二、UDP的首部格式 三、UDP缓冲区 四、基于UDP的应用层协议 五、常见问题 一、UDP概述 UDP(User Datagram Protocol,用户数据协议报)是传输层协议,提供不可靠服务,其特点包括: 无连接:知道对端…

Nginx基础入门

一、Nginx的优势 nginx是一个高性能的HTTP和反向代理服务器,也是一个SMTP(邮局)服务器。 Nginx的web优势:IO多路复用,时分多路复用,频分多路复用 高并发,IO多路复用,epoll&#xf…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,&quo…

基于springboot + vue实现的前后端分离-酒店管理系统

项目介绍 基于springboot vue实现的酒店管理系统一共有酒店管理员和用户这两种角色。 管理员功能 登录:管理员可以通过登录功能进入系统,确保只有授权人员可以访问系统。用户管理:管理员可以添加、编辑和删除酒店的用户,包括前…

前端构建效率优化之路

项目背景 我们的系统(一个 ToB 的 Web 单页应用)前端单页应用经过多年的迭代,目前已经累积有大几十万行的业务代码,30 路由模块,整体的代码量和复杂度还是比较高的。 项目整体是基于 Vue TypeScirpt,而构…

React18原理: React核心对象之Update、UpdateQueue、Hook、Task对象

Update 与 UpdateQueue 对象 1 ) 概述 在fiber对象中有一个属性 fiber.updateQueue是一个链式队列(即使用链表实现的队列存储结构)是和页面更新有关的 2 )Update对象相关的数据结构 // https://github.com/facebook/react/blob/v18.2.0/pa…

前端架构: 实现脚手架终端UI样式之ANSI escape code, Chalk, Ora介绍

在脚手架当中实现命令行的UI显示 1 )概述 在命令行中,如果想实现除传统的常规文本以外的内容比如想对字体进行加粗斜体下划线,包括对它改变颜色改变前景色改变后景色等等需要借助一个叫做 ANSI escape code 这样的一个概念它其实是一个标准&…

Servlet(1)

文章目录 什么是ServletServlet 主要做的工作 第一个Servlet程序1.创建项目2. 引入依赖3. 创建目录1) 创建 webapp 目录2) 创建 web.xml3) 编写 web.xml 4. 编写代码5. 打包程序7. 验证程序 什么是Servlet Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 AP…

投标文件模版的制作以及使用

投标文件中,不能每次都是设置文档,制作好一个模版就是一只使用 步骤1:找到一个调试好的投标文件,把所有内容都是删除,保留空的内容,如下 步骤2:指定到我的文档--自定义office模版--选择word文档…

基于深度学习的红肉新鲜过期判决系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 系统构成与流程 4.2 模型训练与优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...............................................…

Vue状态管理库-Pinia

一、Pinia是什么? Pinia 是 Vue 的专属状态管理库,它允许支持跨组件或页面共享状态,即共享数据,他的初始设计目的是设计一个支持组合式API的 Vue 状态管理库(因为vue3一个很大的改变就是组合式API),当然这…

DBeaver使用遇到的问题汇总

文章目录 1、Dbeaver一次性执行多条sql语句2、执行外部sql文件3、sql编辑器显示行号 1、Dbeaver一次性执行多条sql语句 右键连接,编辑连接,将连接设置中、驱动属性中allowMultiQueries从 默认的false改为true就行。 参考博客:使用DBeaver一…