Redis: Sorted Set 底层算法的简单分析

概述

  • 我们先看下 Shorted Set 有序集合的内部数据结构
  • 所谓有序集合,比如有个容器,容器里边都已经排好序了,那无非就是快速的查找和插入
  • 不管你是查找还是插入,肯定要确定那个位置
  • 最简单的办法就是从最开头开始,挨个比较最终找到我们的位置
  • 这个实际上在数据集比较大的时候,它的性能就会比较低了
  • 它的时间复杂度是O(n),实际上可以提升至 O(logn)

算法选择和分析


1 ) 二分查找

  • 在一个单调有序的集合中查找元素
  • 步骤
    • 每次将集合分为左右两部分
    • 判断解在哪个部分中并调整集合上下界
    • 重复直到找到目标元素
  • 时间复杂度 O(logn) 优于直接顺序查找 O(n)
  • 在 Sorted Set 里边不是用二分查找来快速的实现插入和读取的
  • 二分查找的限制是:有序的数组,而 Sorted Set 用的是链表
  • 这里用了一种新的数据结构,叫做跳跃列表 SkipList

2 )跳跃列表 SkipList

  • 它算法的核心思想是用空间换时间

  • 跳表由多条链表 L0 … LN 以及下行指针构成

  • 最底下的是原始链表,把原始链表里边的这每一个节点,随机做节点升级

  • 第一级索引链表是新构建出来的链表,是原始链表的子集,可理解为其索引

  • 要实现快速查找,基于此种方式,可进行再次升级,如上图所示

  • 这里有4层,L0 ~ L3 这 4 层链表

  • 在原始链表中,比如黄色部分是有序的,它是由score来排序的,浅蓝色为value值

  • 这个节点升级是内部有一个随机的算法,这个随机算法是概率性的

  • 这个算法作者根据概率性,做节点随机升级,就像抛硬币一样

  • 这个算法经过了大量的测试之后,有极少部分情况下会出现O(n)的情况

  • 它不影响整体时间复杂度为 O(logn), 这种属于正常现象

  • 在这个跳跃列表里边,如何去找的呢?

    • 它是从最顶层开始找的,然后找不到回来就往下走,最终到原始链表
    • 在这个过程中找到立即停止,如果没有找到,则查找失败
  • 再来看下链表的构建过程

    • 每一个链表,包括我们的原始链表和上层构建出来
    • 在这些索引列表中,每一个都是从负无穷到正正无穷大
    • 这里面score从负无穷大始一直到正无穷大,然后它内部做了一个排序
  • 现在要去快速的查找和插入它

    • 内部它自己会根据概率算法先升级构建链表
    • 升级之后,现在要去处理,要去找的话,就是从最顶层开始
    • 如上图,逐层跳跃查找
    • 最后用完了链表都找不到,则查找失败
    • 这是完整的查找过程
  • 它实际上是一个zip list,就是压缩的列表

  • 那为什么不用红黑树平衡树来实现,为什么要用跳入列表?

    • 首先,跳跃列表,红黑树,平衡树,它们最终的时间复杂度都是o(logn),就是它们的性能都是一样的
    • 从源码上去出发的话,跳跃列表的实现是完全要简单于红黑树和平衡树的
    • Redis 作者在构建建这个 sorted set 的时候,会有几点考虑
    • 如果用红黑树平衡树,写这个源码的过程中可能会比较复杂
    • 考虑到它要开源,后续可能很多人要过来看源码学习
    • 相对于简单的跳跃列表 skip list 来现整个过程,它的性能有没有降低

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

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

相关文章

查找与排序-插入排序

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序…

2024年10月2日历史上的今天大事件早读

1683年10月2日 清朝康熙帝统一台湾 1869年10月2日 印度民族解放运动领袖甘地诞辰 1890年10月2日 中共创始人之一李达诞生 1895年10月2日 天津中西学堂(天津大学前身)开学 1901年10月2日 郑士良等发起惠州起义 1909年10月2日 京张铁路正式通车 1920…

LeetCode[中等] 238. 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂…

java常用框架结构

1. Spring框架 特色:Spring框架就像是一个万能工具箱,提供了丰富的功能来满足开发者的各种需求。它支持面向切面编程(AOP)、依赖注入(DI)等特性,使得代码更加模块化和可维护。Spring还提供了对数…

calibre-web的翻译translations

calibre-web的翻译translations Windows安装calibre-web,Python-CSDN博客文章浏览阅读539次,点赞10次,收藏11次。pip install calibreweb报错:error: Microsoft Visual C 14.0 or greater is required. Get it with "Microso…

【QT 开发日志】QT 基础控件详解:按钮、文本框与标签的使用

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 博主简介 博主致力于嵌入式、Python、人工智能、C/C领域和各种前沿技术的优质博客分享,用最优质的内容带来最舒适的…

【C语言】数组(下)

6、二维数组的创建 6.1二维数组的概念 通过数组(上)介绍,我们学习了一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时就是二维数组,以此类推,如果把二维…

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限,穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版

推荐:《算法竞赛》,算法竞赛大全书,网购:京东 天猫  当当 文章目录 《蓝桥杯算法入门》内容简介本书读者对象作者简介联系与交流《蓝桥杯算法入门 C/C》版目录 《蓝桥杯算法入门 Java》版目录 《蓝桥杯算法入门 Python》版目录 …

调用飞书接口导入供应商bug

1、业务背景 财务这边大部分系统都是供应商项目,由于供应商的研发人员没有飞书项目的权限,涉及到供应商系统需求 财务这边都是通过多维表格进行bug的生命周期管理如图: 但多维表格没有跟飞书项目直接关联,测试组做bug统计的时候无…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30目录1. Proof Automation with Large Language Models概览:论文研究背景:技术挑战:如何破局…

成都睿明智科技有限公司赋能商家高效变现

在这个日新月异的数字时代,抖音电商正以不可阻挡之势崛起,成为众多品牌与商家竞相角逐的新战场。在这片充满机遇与挑战的蓝海中,成都睿明智科技有限公司如同一颗璀璨新星,凭借其专业的服务、创新的策略和敏锐的市场洞察&#xff0…

关联式容器:map和set

引言: 在计算机科学中,我们经常需要处理一系列具有关键字的元素,并希望对这些元素进行高效的查找、插入和删除操作。为了满足这些需求,我们可以使用BSTree来实现。BSTree作为一种基础的数据结构,它不仅能够帮助我们快…

基于 C# 的文本文件的编码识别

基于 C# 的文本文件的编码识别 前言一、有 BOM 文件头二、无 BOM 文件头三、简体中文汉字编码四、C# 程序对编码的识别1、文件选择按钮代码:2、获取文件编码,有 BOM 的文件识别3、获取文件编码,UTF8 无 BOM 文件的识别4、获取文件编码&#x…

【在Linux世界中追寻伟大的One Piece】System V共享内存

目录 1 -> System V共享内存 1.1 -> 共享内存数据结构 1.2 -> 共享内存函数 1.2.1 -> shmget函数 1.2.2 -> shmot函数 1.2.3 -> shmdt函数 1.2.4 -> shmctl函数 1.3 -> 实例代码 2 -> System V消息队列 3 -> System V信号量 1 -> Sy…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代,抖音作为短视频直播的超级流量池,正深刻改变着人们的购物习惯。无数商家蜂拥而至,渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务,成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

掌控物体运动艺术:图扑 Easing 函数实践应用

现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用。在数字孪生领域,动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象…

OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:YOLOv11来了:将重新定义AI的可能性 Ultralytics YOLOv11的问世标志着人工智能领域,尤其是计算机视觉领域的一个突破性时…

quiz: python网络爬虫之规则1

下面答错了: B c 8A, 9A

大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…