今天学习了跳跃表,记录一下下~

一、跳跃表简介

跳跃表是一种随机化数据结构,基于并联的链表,其效率可以比拟平衡二叉树,查找、删除、插入等操作都可以在对数期望时间内完成,对比平衡树,跳跃表的实现要简单直观很多。

以下是一个跳跃表的例图(来自维基百科):

从图中可以看出跳跃表主要有以下几个部分构成:

1、  表头head:负责维护跳跃表的节点指针

2、  节点node:实际保存元素值,每个节点有一层或多层

3、  层level:保存着指向该层下一个节点的指针

4、  表尾tail:全部由null组成

跳跃表的遍历总是从高层开始,然后随着元素值范围的缩小,慢慢降低到低层。

用大白话来解释一下跳跃表:

如上图,

跳跃表在redis中主要是有序表的一种底层实现。对于普通链表的查找,即使有序,我们也不能使用二分法,需要从头开始,一个一个找,时间复杂度为O(n)。而对于跳跃表,从名字可以看出跳跃表的优势就在于可以跳跃。如何做到呢?在于其特殊的层设计。比如我们查找46,普通链表只能从头开始查找,比对-3,2,17...直到46,要比对7次。但是对于跳跃表,我们可以从最高层开始查找:

第一步:在L4层直接与55比对,发现大了,退回到第3层

第二步:在L3层与21比对,发现小了,继续往前比对55,发现大了,退回到第二层

第三步:在L2层与37比对,发现小了,往前,与55比对,发现大了,退回到第一层

第四步:在第1层,与46比对,查找成功。

共比对了6次,比普通链表只节省了一次,似乎没什么优势。但如果细想,当链表比较长的时候,在高层查找时,跳过的元素数量将相当可观,提速的效果将非常明显。比如如果元素在55之后,在L4层,我们直接就跳过了7个元素,这是非常大的进步。

跳跃表(Skiplist)是一种随机化数据结构,它在查找、插入、删除等操作的期望时间复杂度都能达到对数级,并且编码相对简单许多,跳跃表目前是Redis中用于存储有序集合的底层数据结构,另外可以存储有序集的数据结构是字典,Redis中还有一种底层数据结构intset可以用来存储有序整数集。

Redis作者通过对原有的跳跃表进行修改,包括span的设计、score值可以重复、添加tail与backward指针等,从而实现了排序功能,从尾至头反向遍历的功能等。

Redis内部数据结构-跳跃表相关推荐

  1. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    Redis内部数据结构详解(6)--skiplist  2016-10-05 本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skipl ...

  2. Redis内部数据结构详解(2)——skiplist

    Redis里面使用skiplist是为了实现sorted set这种对外的数据结构.sorted set提供的操作非常丰富,可以满足非常多的应用场景.这也意味着,sorted set相对来说实现比较复 ...

  3. [转]Redis内部数据结构详解-sds

    本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...

  4. 二、HBase的核心数据结构 跳跃表、LSM树、布隆过滤器

    文章目录 HBase的核心数据结构 跳跃表(SkipList) LSM树 布隆过滤器 布隆过滤器算法示例 HBase与布隆过滤器 HBase的核心数据结构 HBase的一个列簇(Column Fami ...

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

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

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

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

  7. Redis数据结构-跳跃表

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

  8. redis内部数据结构深入浅出

    最大感受,无论从设计还是源码,Redis都尽量做到简单,其中运用到的原理也通俗易懂.特别是源码,简洁易读,真正做到clean and clear, 这篇文章以unstable分支的源码为基准,先从大体 ...

  9. redis为什么选择了跳跃表而不是红黑树

    Redis只在两个地方用到了跳跃表,一个是实现有序集合键(zset),另一个是在集群节点中用作内部数据结构,除此之外,跳表在Redis里面没有其他用途. 但是为什么用跳表而不用红黑树呢?猜想如下: 1 ...

最新文章

  1. [Cocos2d-x For WP8]ActionManager动作管理
  2. Directory lookup for the file xxx.mdf failed with the operating system error 2
  3. 2018 German Collegiate Programming Contest (GCPC 18)
  4. .net core 文件流保存图片_Java--利用TCP实现文件上传
  5. npm依赖管理java_探讨npm依赖管理之peerDependencies
  6. java类 连接时机_java类的加载时机
  7. 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护
  8. cad连接mysql,AutoCAD 2004 使用外部数据库
  9. BG.Hive - part3
  10. 纪念 C语言之父 丹尼斯·里奇 逝世11周年:他发明了计算机世界的钢筋水泥!...
  11. python中digits用法_在sklearn digits examp中使用自己的图像
  12. Android Studio简介
  13. 乐高机械系列01:曲柄滑块剪叉机构
  14. 英雄联盟一直连接服务器win10,浅析win10英雄联盟连接不上服务器的解决教程
  15. 活动回顾 | Mini XMan线上快闪活动圆满结束!
  16. kedacom摄像头怎么预置_【科达 HD95D会议摄像机控制键盘】 - 太平洋安防网
  17. 几种将将虚幻引擎内容流送到多个平台的推流方案比较
  18. 5、hibernate第六课
  19. oracle bround,【案例】Oracle警告 WARNING:inbound connection timed out (ORA-3136)解决办法
  20. 网下“范跑跑”:范美忠的另一面

热门文章

  1. [vue] vue怎么缓存当前的组件?缓存后怎么更新?
  2. [css] css中最常用的字体有哪些?你是怎么选择字体的?
  3. 工作67:el-table问题
  4. 前端学习(2365):图片的预览
  5. 前端学习(1391):多人管理项目11邮箱地址查询信息
  6. Java面试题16 牛客 以下java程序代码,执行后的结果是()
  7. java学习(94):cpu随机调用线程测试
  8. 单实例数据库和多实例数据库
  9. CSS3之Transition
  10. JS之字符串截取函数substr