前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList)。

跳表解决的问题

一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是如果是一个有序的链表结构,因为不知道链表两个节点之间的数量,就不能通过二分查找法实现了。

那么就只能通过从头开始遍历查询,但是这种查询是最慢的方式,那么就需要通过其他方法来实现了,而跳表就能够解决这个问题。

跳表出现过程

链表不能快速判断数据是否存在的原因在于不能使用像二分查找法这种算法,不能实现的原因是找不到中间节点,那么我们可以通过把中间节点记录下来,这样就能够找到了。

但是链表是在随时变化的,所以并不能记录中间节点,那么我们可以每间隔一个节点记录一下,把记录的节点组成一个新的链表,如下图:

通过间隔保存,新的链表数量少了接近一半,这样查询起来就要快很多了,比如要查询9,那么就可以从间隔提取那个链表开始查询,查询顺序是1—>5—>8—>8(下一层)—>9。

如果数据太长这样只经过一次抽取还是太大了,间隔链表的数据还是太长,效率还是太大,可以进行多次提取,最终结果如下图:

通过这种多次抽取,最上面的链表长度已经大大的减少,尤其在数据量很大的时候能够大幅提高执行效率。

跳表的查询

那么跳表的查询是如何实现的呢?这里以上图为例,判断12是否在链表中。

首先拿到最顶上的节点,如果当前节点大于12那么说明12不存在链表中,然后当前节点的右节点与12比较,发现比12大,那么节点下沉。

下层到第二层验证右节点(第二层值为8的节点)发现比12小,切换验证值为8这个节点,然后再验证节点的右节点(第二次值为13的节点)发现比12大,所以再次下沉。

来到第三层值为8的节点,发现它的右节点11比12小,所以切换到11节点进行验证右节点,11节点的右节点为13,比12大,所以再次下沉;

来到第四层值为11的节点,发现它的右节点等于12,所以存在。如果发现小于12那么需要继续往右走,发现大于12则往下走,如果下节点为null则查找结束,说明不存在。

验证的过程如下图:

判断的流程总的来说比较简单,拿到最顶层最左边的节点,如果当前节点比判断的值大则直接不存在,接下来就是当前节点的右节点与值得比较,根据判断结果分三种情况:

相等说明存在,也就是找到了;

右节点较大,往下沉,如果下层为null,则说明到了最底层,所以不存在;

右节点较小,切换右节点继续验证,右节点的节点为null则下沉,下沉为null则说明不存在;

总结

今天只是简单的梳理了跳表的原理,但是也可以看出来跳表是一个最典型的空间换时间解决方案,而且只有在数据量较大的情况下才能体现出来优势。而且应该是读多些少的情况下才能使用,所以它的适用范围应该还是比较有限的。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

java 跳表_数据结构跳表学习并用Java实现相关推荐

  1. mysql 线性表_数据结构-线性表之顺序表

    线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...

  2. java 双向链表排序_数据结构之(2)JAVA实现双向链表

    public class DoubleLinkedList { // 节点类Node private static class Node { Object value; Node prev = thi ...

  3. 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)

    深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...

  4. java 广义表_数据结构:广义表的实现(Java)

    Java实现广义表: package 广义表; import java.util.Stack; public class Test { public final int TAG_TABLE = 1; ...

  5. 当identity_insert 设置为off时不能为表_硬盘跳线怎么设置 硬盘跳线设置方法【详解】...

    硬件是有参数作为开关来设置的, 硬件的设置开关就称为跳线(Jumper). 一.了解跳线的类型迄今为止,跳线已经发展到了三代, 分别是键帽式跳线.DIP式跳线.软跳线. 1.键帽式跳线 . 键帽式跳线 ...

  6. Java毕业设计_数据结构课程在线学习辅导系统

    数据结构课程在线学习辅导系统 数据结构课程在线学习辅导系统mysql数据库创建语句 数据结构课程在线学习辅导系统oracle数据库创建语句 数据结构课程在线学习辅导系统sqlserver数据库创建语句 ...

  7. html树形结构_数据结构-线性表.md

    数据结构基本概念 相互之间存在一种或多种特定关系的数据元素集合. (ER图:实体关系图) 数据对象中数据元素之间的关系 逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构 下图:从又到左 ...

  8. 广义表取表头表尾_数据结构广义表的递归算法

    Hello同学们,又到了美妙的星期三,很开心又和大家见面了.这次我们要来讲一讲关于广义表的那些事儿! 俗语说:"与其临渊羡鱼,不如退而结网." 希望通过今天的学习大家可以有所收获. ...

  9. java hash 分库分表_分库分表方案

    摘自:Java技术栈 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值. 在业务Service来看就是,可用数据库连接少 ...

最新文章

  1. 计算机知识新闻稿,文科计算机大赛新闻稿
  2. 【前端Talkking】CSS系列-css3之box-shadow介绍
  3. WSS 3.0 在默认的情况下不存在IRM的protector.
  4. 在vue3+vite+ ts 项目中使用svg
  5. 从语义开始 – 概念、意义、实践
  6. 宠物小精灵之收服(信息学奥赛一本通-T1292)
  7. 大数据分块_谷歌卫星影像金字塔分块下载原理说明
  8. centos7添加新硬盘并挂载
  9. 打开和禁用IPV6的方法
  10. mirbase数据库简介
  11. IntelliJ IDEA常用插件及其安装
  12. 计算机组成原理_在线作业1,电子科大《计算机组成原理》在线作业1
  13. Beyond Short Snippets: Deep Networks for Video Classification
  14. 【android】手把手轻松集成微信支付
  15. mac 重置mysql root密码_MAC 重置MySQL root 密码
  16. Oulipo HDU - 1686 (使用扩展kmp进行讨伐!)
  17. python统计分析书籍_Python数据分析入门书籍推荐
  18. 【未】Dynamic incentive schemes for managing dockless bike-sharing systems
  19. 微信小程序 - 级联查询
  20. java中方法的细分(普通方法,静态方法,构造方法)

热门文章

  1. python 变量聚类 proc varclus_使用SAS进行简单的聚类分析讲解
  2. NBT:王运浩、区健辉等综述纳米孔测序技术
  3. 扩增子统计绘图3热图:样品相关分析,差异OTU/ASV
  4. Nature-2018-抗菌药物组合有望特异性治疗耐多药性的细菌感染
  5. matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇
  6. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息
  7. R语言普通最小二乘(OLS)回归说明、以及构建普通最小二乘(OLS)回归需要满足的四个假设(Normality(正态性)、Independence(独立性)、Linearity(线性度)、方差齐性)
  8. R语言ggplot2可视化在X轴上可视化时间标签实战:可视化时间标签、对时间标签进行旋转
  9. R语言ggplot2可视化为组合图添加综合图例实战:使用ggpubr包ggarrange函数实现综合图例、使用patchwork包实现综合图例
  10. R语言临床预测模型的评价指标与验证指标实战:综合判别改善指数IDI(Integrated Discrimination Improvement, IDI)