17 _ 跳表:为什么Redis一定要用跳表来实现有序集合?

news2024/11/29 11:32:14

上两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?

实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表(Skip list),也就是今天要讲的内容。

跳表这种数据结构对你来说,可能会比较陌生,因为一般的数据结构和算法书籍里都不怎么会讲。但是它确实是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)。

Redis中的有序集合(Sorted Set)就是用跳表来实现的。如果你有一定基础,应该知道红黑树也可以实现快速地插入、删除和查找操作。那Redis为什么会选择用跳表来实现有序集合呢? 为什么不用红黑树呢?学完今天的内容,你就知道答案了。

如何理解“跳表”?

对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是O(n)。

那怎么来提高查找效率呢?如果像图中那样,对链表建立一级“索引”,查找起来是不是就会更快一些呢?每两个结点提取一个结点到上一级,我们把抽出来的那一级叫做索引索引层。你可以看我画的图。图中的down表示down指针,指向下一级结点。

如果我们现在要查找某个结点,比如16。我们可以先在索引层遍历,当遍历到索引层中值为13的结点时,我们发现下一个结点是17,那要查找的结点16肯定就在这两个结点之间。然后我们通过索引层结点的down指针,下降到原始链表这一层,继续遍历。这个时候,我们只需要再遍历2个结点,就可以找到值等于16的这个结点了。这样,原来如果要查找16,需要遍历10个结点,现在只需要遍历7个结点。

从这个例子里,我们看出,加来一层索引之后,查找一个结点需要遍历的结点个数减少了,也就是说查找效率提高了。那如果我们再加一级索引呢?效率会不会提升更多呢?

跟前面建立第一级索引的方式相似,我们在第一级索引的基础之上,每两个

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

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

相关文章

专业英国TOP1|设计学老师CSC公派伯恩茅斯大学访学

F老师的研究方向侧重于数字设计,比较小众,英国知名大学中涉及该专业的院系不是很多,且只有一个多月的申请时间。我们的申请效率很高,陆续得到英国多个高校的邀请函,最终其选定了伯恩茅斯大学申报CSC。伯恩茅斯大学的动…

对话刘继升:用户只管去“野”,剩下的交给福特纵横

在云南首家Ford Beyond福特纵横纵享空间的盛大开业典礼上,福特再次加速了其福特纵横网络建设,为越野爱好者带来更多乐趣。这一举措标志着福特正积极构筑一个全新的越野生态系统,为越野爱好者提供更多愉快的体验,同时打造一个充满乐…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中,我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import(),那 webpack 是如何实现 import() polyfill 的? 原理分析 我们先来看看下面的 demo function component() {const btn docume…

5个WebGIS功能小技巧

我们在《为什么要研发WebGIS系统?》一文中,分享为什么要研发水经微图Web版的WebGIS系统。 这里,我们再为你分享一下水经微图Web版中的几个功能小技巧。 批量修改标注名称 在工具栏中选择“框选”工具,框选需要修改标注的要素。 …

自定义表单模型小程序源码系统 带完整的部署教程

大家好啊,今天源码小编来给大家分享一款自定义表单模型小程序源码系统。在数字化时代,信息收集和处理显得尤为重要。无论是企业还是个人,都需要通过表单来收集、整理、分析各种信息。但是,传统的表单构建方式往往需要编写大量的代…

电脑如何截屏?一起来揭晓答案!

在数字时代,截屏已经成为我们日常生活和工作中的必备技能。无论是为了捕捉有趣的网络瞬间,保存重要信息,还是为了协作和教育,电脑截屏都是一个强大而方便的工具。本文将介绍三种电脑如何截屏的方法,以满足各种需求&…

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速,人像采集在金融机构身份认证领域中发挥重要作用,为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面: 身份盗用和欺诈风险:传统身份验证方式可能存在漏洞&am…

IS420ESWBH3A GE 附加配置文件和I/O组件中的单独标签

IS420ESWBH3A GE 附加配置文件和I/O组件中的单独标签 为CompactLogix、MicroLogix和ControlLogix等以太网/IP兼容型PLC用户提供了一种节省自动化机器空间、资金和布线的新方法。ClearLink提供4个运动控制轴、一个串行端口、13个可配置的数字和模拟I/O点以及可扩展的I/O。tek …

Spring源码系列-框架中的设计模式

简单工厂 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂…

Linux常用命令——cancel命令

在线Linux命令查询工具 cancel 取消已存在的打印任务 补充说明 cancel命令用于取消已存在的打印任务。 语法 cancel(选项)(参数)选项 -a:取消所有打印任务; -E:当连接到服务器时强制使用加密; -U:指定连接服务器…

LeetCode |142. 环形链表 II

LeetCode |142. 环形链表 II OJ链接 一个指针从相遇点开始走,一个指针从头开始走,它们会在入口点相遇~~ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow,*fast;slow fast head;while(fast && fast->next…

扬帆起航正当时——远航汽车下线仪式在山西运城成功举办

11月8日,“智赢未来 远航汽车——远航汽车下线仪式”在山西省运城市大运集团新能源生产基地成功举办。运城市委书记丁小强、市长储祥好,以及来自省、市、区各级政府领导,远航汽车供应商代表、客户代表、全国主流媒体,大运集团各级…

eclipse的安装与配置详细教程(包括UML插件 汉化 JDK 代码补全 导入导出等)

Eclipse安装与配置详细教程 1.Eclipse安装与配置 1.将JDK与Eclipse这两个软件安装包放在一个文件夹下,方便之后安装使用。 2.安装JDK 在D:LeStoreDownload\Java文件夹下另外新建三个文件夹分别命名为java、jdk和eclipse(分别用于Java、jdk…

必看:一组WhatsApp2023年数据合集,助你深入洞察WS营销

作为一款遍布全球的超级应用,WhatsApp以高人气、广覆盖和高效便利收获了几十亿用户,也无数次连接了用户与企业。对于WhatsApp运营布局,客观数据能为企业提供多方面的依据和判断。本文将从多个维度展示WhatsApp2023年数据,希望能为…

2023年最佳键盘:打字和游戏的顶级键盘,总共十款,总有一款适合你

只有最好的键盘才能真正提供舒适无缝的打字体验。虽然亚马逊的廉价键盘可以帮助你满足日常打字需求,但它们不会像顶级键盘那样快速和灵敏。更重要的是,他们不会优先考虑人体工程学。 任何普通的键盘都可以作为输入设备正常工作。然而,高质量的选项更准确、更快、反应更灵敏…

数据结构——二叉树(2)

接上一篇文章http://t.csdnimg.cn/nsKsW,本次我们接着讲解关于二叉树的相关知识。 一、二叉树的相关性质: 1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 第 i 层上最多有 2^(i-1) 个结点. 2. 若规定根节点的层数为 1 ,则 深度…

10.Form表单中Input输入框设置autoComplete=“off“ 不生效

一、问题的描述 form表单的 password框 有时候我们并不需要chrome自动填充记住的密码这个效果,如下图 二 、正常的预期是什么? 输入框获取焦点时,不展示chrome的默认行为。 三、问题产生的原因分析 发现antd的Input组件的 autocomplete“o…

学习伦敦银交易经验的好方法:亏损

要掌握伦敦银交易的技巧,除了看书学习以外,实践的经验也是很重要的,而这些实践的经验中,从亏损中学习会让经验会更加立体和深刻。下面我们就来讨论一下亏损这个学习伦敦银交易技巧的方法。 首先我们需要了解,不论是伦敦…

语音芯片故障的原因简述

语音芯片在语音设备或者相关产品中应用时会出现故障情况,常见的故障情况更多的是无法发出声音或者声音不连贯,还有声音播报不完整或者混乱等情况。下面让我们来探究芯片本身内部的故障问题,以及外部的原因。 芯片内部自身的故障:…

MySQL binlog 日志解析后的exec_time导致表示什么时间?

1. exec_time 到底表示什么时间? MySQL binlog日志解析后,我们能看到会有 exec_time ,从字面意思理解这个记录的是执行时间,那这个记录的到底是单条sql的执行时间?还是事务的执行时间?下面通过测试来解读一…