数据结构篇:深度剖析跳跃表及与B+树优劣分析

     本文旨在探讨跳跃表的特性及其在实际应用场景中的作用,同时对其与B+树进行比较,以帮助更好地理解和运用这两种数据结构。

跳跃表

什么是跳跃表(skip list)

        跳跃表是一种基于跳跃链表的有序数据结构,它是一种多层链表,每一层都是一个有序的链表。表的每一层都有一个指向下一层的指针,可以快速跳转到更深层次的链表,支持快速的插入、搜索和删除操作。

        其原理是会把数据按照一定的规则分成多个层次,每一层都是有序的,并且每一层的元素数量都比下一层少一半,在搜索从最高层开始,比较要查找的元素和当前层的元素,如果要查找的元素比当前层的元素小,则可以跳转到下一层,如果要查找的元素比当前层的元素大,则继续比较下一个元素,直到找到要查找的元素为止。

        其优势在于搜索时间复杂度可以达到 O(logN),比传统的二分搜索树要快得多,且它的内存占用也比较少,节省大量的内存空间。但它同样也存在着不足,它需要额外的存储空间来存储每一层的指针,而且它的插入和删除操作比较复杂,需要更新多个指针。比起单链表,跳表需要存储多级索引,要消耗更多的存储空间,空间换时间的思路。

        其索引流程首先对链表建立一级“索引”,查找起来会更快,每隔几个结点提取一个结点到上一级,把抽出来的那一级叫做索引层,每加来一层索引之后,查找一个结点需要遍历的结点个数减少,时间复杂度也下降。比如要查找 60,从第一层索引查找到第3个节点发现65比60大,则回到30所在节点下降到一层,继续往前查找即可找到。

应用场景

        Redis的Sorted Set就是使用跳表来实现。

Redis的每种数据结构操作,实际上都是基于多种底层数据结构实现

跳表与B+树的对比

        每一种数据结构都有一个适用场景,结合前面B+树算法章节,我们来想一个问题:MySQL索引为什么使用 B+ 树而不使用跳表?或者说Mysql的InnoDB引擎 3层的B+树可以存储多少条数据 ?

B+树

    1 ) B+ 树是多叉树结构,每个节点存储16k的数据页,每个非叶子节点只存主键值(主键索引)和指针,数据存在于叶子节点。
    2 ) B+树 的一个节点大小=innodb引擎的一页=4个操作系统页(一页4kb)=16kb。
    3 ) B+ 树存放记录数:根节点指针数 x 中间节点数 x 单个叶子节点记录行数。
    4 ) B+树的每个节点可以存16KB数据,假设一行数据大小是1K,那一个叶子节点就可以存16行数据。
    5 ) 非叶子节点存放的是主键值与指针,假设主键类型为bigint,占用8字节, InnoDB 源码中指针占用6字节,共就14Byte。
    6 ) 单个叶子节点(页)大概可以存放为16KB/14Byte=1170个指针。
    7 ) 2层B+树 可以存放1170*16=18720行数据,3层B+树可以存放1170*1170*16=21902400行数据,差不多2000w条数据。
      7.1 ) 如果树高是2, 可以存储1170页的数据,1170*16 = 18720 行数据。
      7.2 ) 如果树高是3,可以存储 1170*1170 = 1368900 = 137万页数据,1170*1170*16 = 2200万行数据。
      7.4 ) 如果树高是4,可以存储 1170*1170*1170 = 16亿页数据,1170*1170*1170*16 = 256亿行数据。
    8 ) B+树三层就可以存储 2kw 左右的数据,查询一次数据,数据页都在磁盘中,最多需要经过三次磁盘 I/O。

跳表

    1 ) 跳表是链表结构,一个节点存储一个数据,如果最底层要存放 2kw 的数据,达到二分查找的效果。
    2 ) 跳表的大概高度在 24 层左右(2kw 大概是 2 的 24 次方)。
    3 ) 如果数据分布不好的情况下, 24 层数据会分散在不同的数据页里,查一次数据会经过 24 次磁盘 I/O。
    4) 存放同样量级的数据,B+ 树的高度比跳表要小,MySQL查询多,磁盘 I/O 次数更少,因此 B+ 树查询更快。
    5) Redis 使用跳表而不使用 B+ 树。
      5.1 ) 进行读写数据时都是内存操作,数据量相对少,不操作磁盘,因此也不存在磁盘 I/O,所以层高就不再是跳表的缺点。
      5.1 ) 写操作B+树要进行拆分索引数据页,跳表是独立插入,没有旋转和维持平衡的开销,跳表的写入性能会比 B+ 树更好。

相关推荐

  1. MySQL数据结构BB+的区别

    2024-04-06 11:28:02       22 阅读

最近更新

  1. TCP协议是安全的吗?

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

    2024-04-06 11:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 11:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 11:28:02       18 阅读

热门阅读

  1. C/C++中const关键字用法总结

    2024-04-06 11:28:02       15 阅读
  2. springcloud第4季 使用resilience4j实现服务流量治理

    2024-04-06 11:28:02       14 阅读
  3. C++入门

    C++入门

    2024-04-06 11:28:02      14 阅读
  4. Linux 指令

    2024-04-06 11:28:02       21 阅读
  5. MySQL Payload

    2024-04-06 11:28:02       12 阅读
  6. 金蝶Apusic应用服务器 未授权目录遍历漏洞复现

    2024-04-06 11:28:02       13 阅读
  7. 在Ubuntu 14.04上如何备份和恢复Redis数据

    2024-04-06 11:28:02       17 阅读
  8. Flink集群从节点TaskManager启动分析

    2024-04-06 11:28:02       12 阅读
  9. 大语言模型LLM《提示词工程指南》学习笔记01

    2024-04-06 11:28:02       14 阅读