跳表是一种什么样的数据结构

跳表是有序集合的底层数据结构,它其实是链表的一种进化体。正常链表是一个接着一个用指针连起来的,但这样查找效率低只有O(n),为了解决这个问题,提出了跳表,实际上就是增加了高级索引。朴素的跳表指针是单向的并且元素值不能重复,redis对其进行了修改,回退指针的作用是支持反向遍历。
在这里插入图片描述
具体查找过程,假设查45,那从5的二级索引一下跳到35,发现还没找到,再跳到55。发现超了,那用一级索引试试,结果找到了,那ok了。需要注意,使用高级索引时候底层源码实现时候还有一个对于步长的记录,也就是5->35用二级索引记录了步长3

插入的话,不会影响当前表中节点的层高,因为节点被创建时和层高就已经确定了(当然可能会修改插入位置前后结点的关联指针,这是链表必然的)。
那一个节点层高如何确定?
这是在插入时候确定的,默认每个节点一开始默认的是1层(一级索引都没有),每次以25%概率增加1层(5.0.5版本最高为64层)。不用一个层高数量的比例是因为不想刻意维护这种比例关系,导致额外开销。

跳表的平均性能能达到O(logn),并且由于表头有定义查询有序集合元素总数时仅需O(1)

那么为啥redis不用b+树呢?
因为b+树是更多用于磁盘io的,其可以降低磁盘io次数。redis是内存中的,所以b+树这扁平特性没那么重要了,并且跳表实现起来简单,也不用考虑在中间位置插入后保持平衡的操作。
同样的问题,为啥不用红黑树?
其实就是因为跳表实现简单,占用内存少(层高概率25%是可以调的,层高越大占用内存越多,折中选择),并且查询性能和局部性不比红黑树差

相关推荐

  1. hashmap数据结构什么

    2024-02-22 18:52:04       12 阅读
  2. 什么数据结构

    2024-02-22 18:52:04       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-22 18:52:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-22 18:52:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-22 18:52:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-22 18:52:04       20 阅读

热门阅读

  1. Web服务器基础介绍

    2024-02-22 18:52:04       26 阅读
  2. vue中swiper使用

    2024-02-22 18:52:04       30 阅读
  3. 在 Golang 中实现 NATS JetStream 队列

    2024-02-22 18:52:04       23 阅读
  4. 蓝桥杯-整数删除

    2024-02-22 18:52:04       26 阅读
  5. 区块链笔记(三)

    2024-02-22 18:52:04       33 阅读
  6. 基本代码讲解

    2024-02-22 18:52:04       31 阅读
  7. 梯度下降与机器学习的关系

    2024-02-22 18:52:04       26 阅读
  8. ORA-600 kclchkblk_4和2662故障---惜分飞

    2024-02-22 18:52:04       32 阅读
  9. Vista 2.08: The storm chaser

    2024-02-22 18:52:04       27 阅读
  10. Unity3D 游戏中的自动寻路有怎样的算法详解

    2024-02-22 18:52:04       36 阅读
  11. android密集架移动动画效果开发

    2024-02-22 18:52:04       29 阅读
  12. Linux中apt-get和apt命令用法汇总

    2024-02-22 18:52:04       28 阅读
  13. 【es6】es5中的类和 es6 中的类 class 有什么区别

    2024-02-22 18:52:04       26 阅读