Redis跳表

news2024/11/16 23:59:04

简介

Redis 中的有序集合(Sorted Set)是用跳表(Skip list)来实现的。这里就需要了解一下跳表的概念。

链表:链表插入,删除某一个节点的时间复杂度是O(1),但是查询的时间复杂度是O(n)。
跳表就是解决链表在有序节点场景下的查询时间复杂度高问题。时间复杂度能达到O(logn)。

跳表

跳表是有多个层级的链表组成。如下图的多级索引和原始链表,每层索引都是一条链表。
在这里插入图片描述

跳表每一层的链表都会随机包含一些原始链表的节点(通过跳表的动态更新策略实现)。层数越高,链表节点越少。
查询策略
因此查询节点时,从最高层级向下查找,通过高层级索引节点的大小和待查找值大小比较,就能比较出查找值大小是在哪两个节点之间,或者就等于某个节点。再一步一步往低层级索引的链表上查找,最终总能找到相等的那个节点。

可以看出,跳表其实是一种空间换时间的策略来减少查询的时间复杂度。

动态更新策略

插入节点

  1. 在跳表中插入新元素时,需要先在底层链表中插入该元素,然后决定该元素是否要成为索引节点。
  2. 可以使用随机函数来决定该元素是否需要成为下一层的索引节点,如果需要,则在下一层都插入一个新的索引节点,该索引节点指向上一层中同一位置的元素。

删除节点

  1. 在跳表中删除元素时,需要先在底层链表中删除该元素,然后考虑是否需要删除对应的索引节点。
  2. 可以从顶层开始遍历跳表,如果某个索引节点指向的元素已经不存在了,则需要删除该索引节点,同时将上一层中相同位置的索引节点指向下一层中相同位置的元素。
  3. 如果最上层的索引节点被删除了,则需要将跳表的高度减少一层。

跳表的高度控制策略

跳表的高度控制策略通常是基于概率的可以定义一个概率p,每次插入元素时,以概率p(0<p<1)决定是否将该元素作为索引节点。查询时间复杂度就是log1/p(n)。
如果是以1/2概率决定是否添加链表,则跳表的高度最大为log2(n)。查询效率也就是log2(n)。

概率过大 vs 概率过小

概率过大,过小都不好。
概率过大会导致跳表中索引节点的数量增加,从而增加了查询时需要访问的节点数,降低了查询效率。因为跳表的查询效率取决于索引节点的数量,节点数量越多,查询效率就越低。
概率越小并不一定就越好。因为概率越小,索引节点的数量就会减少,从而节省了空间,但是查询效率也会降低。如果概率过小,跳表的高度可能无法达到预期的水平,从而失去了跳表的优势。

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

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

相关文章

Jmeter:使用代理录制脚本

目录 前言&#xff1a; 介绍下各设置项&#xff1a; 前言&#xff1a; JMeter 是一个功能强大的性能测试工具&#xff0c;可以用于模拟多种场景下的负载测试和性能测试。其中一个常用的功能是使用代理服务器录制脚本&#xff0c;以便在后续的测试中模拟真实的用户行为。 下…

数据库优化---索引

这里写目录标题 索引简介结构&#xff08;Btree&#xff09;操作总结 索引 简介 优缺点 利远远大于弊 结构&#xff08;Btree&#xff09; 所有的数据都存在叶子节点 操作 具体代码 注意&#xff0c;主键以及唯一约束&#xff0c;都会自动创建一个索引&#xff0c;主键索…

git常用命令之Pull

7. Pull 命令作用延展阅读git pull 1. git fetch2. git merge FETCH_HEAD1. fetch origin的所有分支2. merge 当前分支参考git pull origin master1. git fetch origin master2. git merge FETCH_HEAD 拓展&#xff1a;Git常用命令汇总

时间触发嵌入式系统:各种系统的概念

1.1 引言 一说到软件系统&#xff0c;脑子里面就会闪现很多名词&#xff1a; 信息系统 桌面应用系统 实时系统 嵌入式系统 事件触发系统 时间触发系统 这些名字搞得脑子很乱&#xff0c;感觉都熟悉&#xff0c;又有些陌生&#xff0c;还是需要简单的介绍一下。 1.2 信息系统…

MySQL高可用 MMM

MySQL高可用 MMM 一、MMM1.1 MMM介绍1.2 关于 MMM 高可用架构的说明 二、搭建 MySQL MMM2.1 环境准备2.2 搭建 MySQL 多主多从模式2.3 安装配置 MySQL-MMM 一、MMM 1.1 MMM介绍 Master-Master replication manager for MvSQL&#xff0c;MySQL 主主复制管理器。 1、是一套支持…

vue3如何使用vant中IndexBar索引栏?

目录 1、为什么要使用IndexBar索引栏&#xff1f;2、引入3、基础使用4、处理后端返回的数据5、渲染页面 1、为什么要使用IndexBar索引栏&#xff1f; 在我们开发移动端的时候&#xff0c;有时候会遇到制作通讯录或者城市索引栏&#xff0c;这种时候我们就可以使用vant中快捷方…

warp框架教程2-log模块,addr模块和header模块

log , addr 和 header 从本文开始&#xff0c;我们将介绍 warp 中 Filter 的核心模块。在文档中有 filter 相关模块的介绍&#xff0c; 本文来介绍其中的 addr&#xff0c;header 和 log addr 模块 addr 模块非常简单&#xff0c;它是用来获取远程客户端的地址的。使用起来…

高性能计算学习教程,从入门到精通

学习高性能计算需要一定的计算机科学和数学基础。以下是一个详细的学习路线&#xff0c;从入门到精通高性能计算的步骤&#xff1a; 阶段一&#xff1a;基础知识学习 计算机科学基础&#xff1a;了解计算机体系结构、操作系统、数据结构和算法。学习编程语言如C/C、Python等。 …

苹果手机没法访问Fildder代理服务怎么办

浏览器输入http://ip:port进入可下载证书页面 异常情况&#xff1a; 浏览器访问http://ip:port后无响应&#xff0c;白屏&#xff0c;或有“无法使用跳转网络”的提示 解决方法&#xff1a; 1. PC重新下载fiddle证书并重启 Fildder4--Tools--Options--HTTPS--Actions--"…

【2022吴恩达机器学习课程视频翻译笔记】2.5无监督学习-part-2

2.5无监督学习-part-2 In the last video, you saw what is unsupervised learning, and one type of unsupervised learning called clustering. Let’s give a slightly more formal definition of unsupervised learning and take a quick look at some other types of uns…

ruoyi-vue版本(三十)Spring Security 安全框架中token的生成与解析

目录 1 使用2 写工具类3 使用工具类 1 使用 1 项目里面添加依赖 <!-- Token生成与解析--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>2 写工具类 package com.ruoyi.framework.we…

【MQ】消息队列的简介以及常见问题的解决方案

MQ MQ的基本概念 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;实在消息的传输过程中保存消息的容器。多用于分布式系统之间的通信。 分布式系统的两种通信方式&#xff1a;直接调用、借助第三方间接完成 发送者成为生产者&#xff0c;接受者称为消费者…

想要用独立站打造跨境电商品牌吗?这些方法学起来吧!

随着互联网的发展&#xff0c;越来越多的跨境电商卖家开始考虑在独立站上打造自己的品牌。相比于在第三方平台上经营&#xff0c;拥有独立站不仅能够提高品牌认知度和形象&#xff0c;还能够更好地控制产品质量、维护顾客关系&#xff0c;以及获取更多的利润。而要打造一个成功…

CSS盒模型

目录 盒子区域包含块/containing block包含块的确定包含块的影响 行盒/line-boxes行盒的特性vertical-align BFCFCBFC的创建BFC的作用 关于BFC解决margin折叠问题关于设置overflow:auto解决浮动塌陷问题BFC解决塌陷问题的两个条件BFC计算高度规则 盒子区域 浏览器在展示每一个…

N-121基于微信小程序网上书城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

(23)目标检测算法之YOLOv6 (1)全流程指南:环境安装、模型配置、训练及推理

目标检测算法之YOLOv6 (1)全流程指南&#xff1a;环境安装、模型配置、训练及推理 本文向将介绍 YOLOv6 的整体框架&#xff0c;并提供详细的教程链接。官方论文 ☞ YOLOv6: A Single-Stage Object Detection Framework for Industrial Applicationsv3.0版本论文更新 ☞ YOLOv…

综合评价算法 | Matlab实现基于AHP层次分析法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于AHP层次分析法的综合评价算法 研究内容 AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因 素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作…

测试四—测试分类

一、按测试对象划分 1.1 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;指按照界面的需求&#xff08;一般是UI设计稿&#xff09;和界面的设计规则&#xff0c;对我们软件界面所展示的全部内容进行测试和检查&#xff0c;一般包括如下内容&#xff1a; 验证界面内容…

解决:在微服务中一个服务访问另一个服务的类或方法出现的问题

我的需求&#xff1a; 我需要在用户模块使用公共模块的service和mapper和实体类&#xff0c;出现以下错误 ​ springboot启动错误如下&#xff1a; 报错结果&#xff1a;需要一个类型为“com.buba.yka.mapper.salesmanMapper”的bean&#xff0c;但找不到该bean Error starti…

接口自动化面试题【思路分享】

文末免费领资料 接口自动化流程怎么做的&#xff0c;框架怎么搭建的&#xff1f; 流程&#xff1a; 1、分析需求&#xff0c;确定测试范围 2、搭建自动化测试环境、准备相关测试数据 3、工具选型&#xff0c;搭建测试框架 4、编写用例 5、执行用例&#xff0c;生成测试报…