跳跃表

  • 1. 跳跃表的用处
  • 2. 跳跃表的具体示例
    • 跳跃表的查找
  • 跳跃表的具体实现
  • 本文重点

1. 跳跃表的用处

  1. 有序集合(zset)的底层可以采用数组, 链表, 平衡树等结果来实现, 但是他们都有各自的缺点 . 数组方便查询, 但不便于插入和删除, 链表方便插入和删除, 但是不利于查找, 平衡树/红黑树效率高但是实现起来很复杂
  2. 所以Redis自己实现了跳跃表来来当做有序集合(zset)的底层实现, 他的查询复杂度平均O(logN), 最坏O(N), 堪比红黑树, 但实现起来远比红黑树简单

2. 跳跃表的具体示例

我们先来看一下如果用有序链表来实现有序集合

插入和删除为O(1), 但是查找的复杂度为O(N)
但是我们看跳跃表的实现

我们从有序链表中选取部分节点, 组成一个新的链表如图中的10 -> 30 -> 50 -> 70 -> null, 当做一级索引
如果一级索引中节点还是很多, 我们可以再从一级索引中选取部分节点, 再组成一个新的链表, 并以此作为原始链表的二级索引10 -> 50 -> null

跳跃表的查找

那么跳跃表是如何进行查找的呢

  1. 优先从高层查找
  2. 若当前节点的值, 小于要查找的值, 并且next指针指向大于目标值的节点, 就要降一级寻找, 或者next指针指向了null, 那么也需要降一级查找

跳跃表的具体实现

跳跃表底层使用了zskiplist, 和zskiplistnode两个结构体来实现
zskiplist

typedef struct zskiplist {struct zskiplistNode *header, *tail;unsigned long length;int level;
} zskiplist;
  • header 指向跳跃表表头节点, tail指向表尾节点
  • length:记录跳跃表的长度,也即是,跳跃表目前包含节点的数量(表头节点不计算在内)
  • level:记录目前跳跃表内,层数最大的那个节点的层数(表头节点的层数不计算在内),通过这个属性可以在O(1)的时间复杂度内获取层数最高的节点的层数。
typedef struct zskiplistNode {sds ele;double score;// 后退指针struct zskiplistNode *backward;// 层struct zskiplistLevel {// 前进指针struct zskiplistNode *forward;/*** 跨度实际上是用来计算元素排名(rank)的,* 在查找某个节点的过程中,将沿途访过的所有层的跨度累积起来,* 得到的结果就是目标节点在跳跃表中的排位*/unsigned long span;} level[];
} zskiplistNode;
  • backward 指针指向前一个节点, 用于方便寻找数据

  • sds动态字符串存储内容, score存储分数, 用来排序使用

  • level(每个节点的层数) :
    节点中用1、2、L3等字样标记节点的各个层,L1代表第一层,L代表第二层,以此类推.

    每个层都带有两个属性:前进指针和跨度。前进指针用于访问位于表尾方向的其他节点,而跨度则记录了前进指针所指向节点和当前节点的距离(跨度越大、距离越远)。在上图中,连线上带有数字的箭头就代表前进指针,而那个数字就是跨度。当程序从表头向表尾进行遍历时,访问会沿着层的前进指针进行。

相当于这是三个节点第一个节点处于第0层, 第二个节点他是可以处于三层, 第三个节点可以处于5层

下图是根据具体一点的一个跳跃表实现

header指向的是一个层高为32的伪头结点, 实际链表的开端是这个伪头结点的后一个节点, 根据这个伪头结点就可以快速的找到层数最高的, 因为其他节点的层数都是要比32小的

本文重点

  • 跳跃表基于单链表加索引的方式实现
  • 跳跃表以空间换时间的方式提升了查找速度
  • Redis有序集合在节点元素较大或者元素数量较多时使用跳跃表实现
  • Redis的跳跃表实现由 zskiplist和 zskiplistnode两个结构组成,其中 zskiplist用于保存跳跃表信息(比如表头节点、表尾节点、长度),而zskiplistnode则用于表示跳跃表节点
  • Redis每个跳跃表节点的层高都是1至32之间的随机数

Redis之跳跃表(面试重点容易考)相关推荐

  1. Redis数据结构——跳跃表-skiplist

    跳跃表简介: 跳跃表是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持评价O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量 ...

  2. Redis数据结构-跳跃表

    跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的. 跳跃表支持平均 O(log N) 最坏 O(N) 复杂度的节点查找, 还可 ...

  3. Redis之跳跃表实现

    http://redisbook.com/index.html 跳跃表的实现 Redis 的跳跃表由 redis.h/zskiplistNode 和 redis.h/zskiplist 两个结构定义, ...

  4. redis(五)跳跃表

    一:基本概念 跳跃表是一种随机化的数据结构,在查找.插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单.跳跃表的定义如下 ...

  5. Redis中跳跃表浅析

    一.前言 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的.跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过 ...

  6. redis sorted_set跳跃表(skiplist)

    Sortedset底层存储结构 两种数据结构支持 ziplist和 skiplist 只有同时满足如下条件是,使用的是ziplist 1.有序集合保存的元素数量小于128个 2.有序集合保存的所有元素 ...

  7. 学习笔记-Redis设计与实现-跳跃表

    跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操 ...

  8. Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?

    欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 老周写这篇文章的初衷是这样的,之前项目中有大量使用 R ...

  9. Redis 为什么这么快? Redis 的有序集合 zset 的底层实现原理是什么? —— 跳跃表 skiplist

    Redis有序集合 zset 的底层实现--跳跃表skiplist Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 ...

最新文章

  1. EM算法 大白话讲解 没看懂 保存
  2. 使用Crypto++ ecdsa 进行签名和认证
  3. Python学习之路 (六)爬虫(五)爬取拉勾网招聘信息
  4. linux select 多路复用机制
  5. zookeeper + kafka集群搭建详解
  6. Eclipse 常用快捷键,实战经典
  7. CoderForces999D-Equalize the Remainders
  8. 2022年最新过DD检测方法dd防检测方法
  9. python前端用什么写_Python 竟然也可以写网页前端了
  10. Unity常用工作视图(上)(5大基本视图)
  11. stream流、数学类、String类的常用方法、date、密码等
  12. 一个匹配数字的正则表达式(带详细解释)
  13. txs0108e原理分析
  14. 你的 APP 能否精准「推送」击中用户?!
  15. 《寒假去世十 第八章》
  16. 去后厂村开游戏厅吧!基于PP-TinyPose的简易体感游戏开发框架
  17. web前端面试基本知识重点(下)
  18. GII全球创新指数2013-2020
  19. python模块及包的导入
  20. PLC通信协议【三菱Q系列】MC协议

热门文章

  1. A Self-Attention Setentence Embedding 阅读笔记
  2. 文巾解题 929. 独特的电子邮件地址
  3. 文巾解题 16. 最接近的三数之和
  4. MATLAB实战系列(三十四)-MATLAB基于PCA-LDA模糊神经网络的人脸识别
  5. Hadoop streaming: Exception in thread main java.io.IOException: No space left on device
  6. Android安卓开发-'Theme.AppCompat.Light'无法找到的解决方案
  7. flink入门实战总结
  8. 利用solr的 DataImportHandler从mysql数据库建立索引
  9. Haunt - Youzan 服务发现 概述
  10. HBASE+Solr实现详单查询--转