跳跃表基本概念?

  • 跳跃表是(skiplist)是一种有序的数据结构,通过在每个节点中维持多个指向其他节点的指针,从而使查找更加迅速。
  • 跳跃表的查找时间复杂度平均O(logN),最坏O(n)。
  • 跳跃表可以看作为是一个升级版的链表,从原理来推的话也有些像是从二叉树演变过来的。
  • Redis中有序集合键的底层实现之一就是跳跃表(有序集合元素数量比较多,有序集合元素的成员是比较长的字符串)

快速了解跳跃表的底层推荐一篇博客:https://www.jianshu.com/p/09c3b0835ba6。

跳跃表的实现

前边提到过,跳跃表可以称得上是一个进化版的链表,跳跃表中每一层的每一个节点都有一个前进指针,和跨度(就是当前指针指的节点和现在节点的距离),当然还有回退指针等,下边就来详细的分析以下它的底层数据结构和设计思路。

跳跃表节点的设计思路

typedef struct zskiplistNode{//后退struct zskiplistNode *backward;//分值double score;//成员对象robj *obj;//层struct zskiplistLevel{//前进指针struct zskiplistNode *forward;//跨度unsigined int span;} level[];
}zskiplistNode;前进指针:比如我们需要遍历所有的跳跃表节点,那就使用前进指针来一步一步向前遍历(指向的节点跨度为1就相当于遍历了)后退指针:可以进行从后往前的遍历,从上边的结构体可以看到,每一个节点只有一个backward指针,因此,从后往前的遍历结过也一定是唯一的。跨度就相当于现实生活中的路程,也可以说成为里程,或者是排位。指向null的所有节点的跨度都为0.obj:是指向一个SDS类型的指针,它就是保存的值在我们使用有序集合的时候,它的有序性就是利用score来决定的,因此score是有序性的保证。层的实现是一个数组,为什么是一个数组有没有想过?
我认为它是为了在查找过程中从上往下,从大跨度到小跨度,缩小范围的时候就层数减一进入下一层搜索。
level可以包含多个元素,每一个元素都包含一个zskiplistLevel的结构体(指向其他节点的指针):可以理解为level是某一个SDS值存的指向其他SDS值的指针。
每次创建新的跳跃表节点时,程序根据幂等定律(越大的数出现的概率越少)随机生成一个1到32层的值作为level数组的大小。

跳跃表

跳跃表就是多个跳跃表节点组成,通过一个跳跃表节点来标记和记录一些跳跃表的信息(zskiplist)。


typedef struct zskiplist{//表头和表尾struct skiplistNode *header,*tial;//表中节点数量unsigined long length;//表中最大的层数 int level;}zskiplist;

理解了前面的,这个就只是一个头节点记录一些东西罢了。
跳跃表虽然实现不难,但是对于有序查找效率还是极高的!

Redis的设计与实现之跳表相关推荐

  1. Redis Zset的实现为什么用跳表,而不用平衡树?

    之前写过一篇 Redis 数据类型的底层数据结构的实现,其中提到,ZSet 对象的底层数据结构实现之一是跳表. 然后,有读者就问:为什么不使用平衡树(如红黑树.AVL 树)? 我们先来了解下跳表,再来 ...

  2. 【架构师修炼之路】Redis 极简教程 : 基本数据结构, 跳表原理, Spring Boot 项目使用实例

    引言 本文主要介绍 Spring Boot 应用中使用 Redis 的基础知识. Redis 是什么 Redis: REmote DIctionary Server Redis is an in-me ...

  3. 【架构师修炼之路】Redis 极简教程 : 基本数据结构, 跳表原理, Spring Boot 项目使用实例...

    引言 本文主要介绍 Spring Boot 应用中使用 Redis 的基础知识. Redis 是什么 Redis: REmote DIctionary Server Redis is an in-me ...

  4. redis sorted_set数据类型常用命令及跳表skip_list原理

  5. 为啥 redis 使用 跳表 (skiplist) 而不是使用 red-black?

    基本结论 1.实现简单. 2.区间查找快.跳表可以做到O(logn) 的时间复杂度定位区间的起点,然后在原始链表中顺序往后遍历就可以了. 3.并发环境优势.红黑树在插入和删除的时候可能需要做一些reb ...

  6. 详解高级数据结构之 跳表

    目录 一.跳表的介绍 二.跳表的数据结构图 三.跳表的查找 四.跳表是不是很浪费内存? 五.跳表高效的动态插入和删除 跳表索引动态更新 六.跳表的特性 七.小结 八.C++实现简易跳表 一.跳表的介绍 ...

  7. 每日一博 - 如何理解跳表(SkipList)

    文章目录 什么是跳跃表SkipList 跳表关键字 Why Skip List Code 跳表-查询 跳表-删除 跳表-插入 小结 完整Code 什么是跳跃表SkipList 跳跃表(简称跳表)由美国 ...

  8. skiplist - 跳表

    一 前言 跳表(skiplist.跳跃表) 是一个很优秀的数据结构,比如用于 Redis.levelDB等出名的开源项目上.跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找. 它的结构特 ...

  9. Redis 为什么用跳表而不用平衡树?

    本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用skiplist是为了实现sorted s ...

最新文章

  1. 微信小程序 - 时间戳转时间
  2. 将自己数据集转化为lmdb格式
  3. 常用注入 Script 方法
  4. 学习php技巧,对初学者非常有用的PHP技巧
  5. 海底捞发布公告 预计去年最高亏损45亿
  6. 6月首批国产游戏获批:共55款 腾讯B站上榜
  7. 【自考总结】寒冬里的温暖
  8. 用计算机探索ppt,《用计算器探索规律 2》ppt课件.ppt
  9. 如何理解t检验、t分布、t值?
  10. Java设计模式——工厂模式——模拟Spring
  11. ZigBee Routing Tables 路由表
  12. IT行业前景真的好吗_转IT学什么语言好?
  13. Linux的基本学习(四)——磁盘与文件系统管理
  14. 免费高清壁纸网站推荐
  15. 如何修复Android手机上无响应的触摸屏
  16. centos8代理上网_centos设置代理上网
  17. 新手必备pr 2021快速入门教程「十一」PR字幕添加
  18. 计算机领域的道德模范,2015-2016年学校道德模范董敏事迹
  19. 堆、栈的概念及使用特性
  20. App自动化元素查看工具

热门文章

  1. 图解集合8:红黑树的移除节点操作
  2. CentOS 7.x安装配置
  3. 参数传值(数组赋值)
  4. Git之签署工具GPG的安装和使用
  5. 【数据结构与算法】之深入解析“等差数列划分”的求解思路与算法示例
  6. Swift之深入解析“类”的底层原理
  7. 2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序
  8. 20万人仍然每天活跃在“死”掉的ofo APP上:这已变成一个返利应用
  9. Pycharm2018最新激活方式
  10. Java面向对象(四)final关键字