目录

一.跳跃表的概述

二.跳跃表的定义

三.跳跃表的查找操作

四.跳跃表的插入操作

五.跳跃表的删除操作

六.补充


一.跳跃表的概述

话不多说,增加了向前指针的链表就叫作跳跃表。那么跳跃表和普通的单链表有什么区别呢?

我们知道, 在单链表中查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时间复杂度。 例如,在下图中,我们要寻找值为6的节点,那么我们要经过6次对比。

而当我们使用跳跃表时,情况就大有不同。例如,在下图所示的跳跃表中,我们寻找值为6的节点,只需要进行4次对比。

从图中可以知道:

  • 跳跃表是由一系列的结点构成,每一个结点都包含关键字域(key)和索引层级数组域(reference level)。
  • 有一个key为负无穷(-inf)的头结点和一个key为正无穷(inf)或null的尾结点,它们的索引层数都相同且具有最大索引层数。
  • 其余的结点为有序的普通数据结点,它们具有的索引层数是随机产生的。最大索引层数不超过头尾结点的最大索引层数,但最少必须拥有一层索引。当所有结点都只具有一层索引的时候,此时跳跃表就退化成了单链表。

这里简单说下这些数据结点的索引层数是如何随机确定的。首先,结点必须最少有一层索引,在此基础上抛掷一枚硬币,若出现正面,结点索引层数加1并继续抛掷,若出现反面,即刻停止,这时的索引层数即为最终的结点索引层数。用一句术语说就是:每一层结点出现在其上层的概率固定为p。而这里我们抛掷硬币只不过将p取值为0.5罢了。实际情况下,P取值0.5、0.25、1/e都可以取得不错的效果。

(当大量的新节点通过逐层比较,最终插入到原链表之后上层的索引节点会渐渐变得不够用。这时候需要从新节点当中选取一部分提到上一层当做索引。可是究竟应该提拔谁忽略谁呢?关于这一点,跳跃表的设计者采用了种有趣的办法:【抛硬币】也就是随机决定新节点是否提拔,每向上提拔一层的几率是50%。之所以采用这种方法,是因为跳跃表删除和添加的节
点是不可预测的,很难用一种有效的算法来保证跳表的索引分部始终均匀。随机抛硬币的方法虽然不能保证索引绝对均匀分布,却可以让大体趋于均匀。)

二.跳跃表的定义

现在我们知道,跳跃表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳跃表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳跃表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。

采用这种随机技术,跳跃中的搜索、插入、删除操作的时间均为O(logn),然而,最坏情况下时间复杂性却变成O(n)。相比之下,在一个有序数组或链表中进行插入/删除操作的时间为O(n),最坏情况下为O(n)。

空间复杂度为O(n)。

三.跳跃表的查找操作

在跳跃表中查找一个元素x,按照如下几个步骤进行:

1. 从最上层的链(Sh)的开头开始

2. 假设当前位置为p,它向右指向的节点为q(p与q不一定相邻),且q的值为y。将y与x作比较

    (1) x=y  输出查询成功及相关信息

    (2) x>y  从p向右移动到q的位置

    (3) x<y  从p向下移动一格

3. 如果当前位置在最底层的链中(S0),且还要往下移动的话,则输出查询失败

一定注意,不是和当前元素比较,是和当前元素的下一元素比较。

四.跳跃表的插入操作

跳跃表的插入操作可以分解为以下三步:

  1. 首先查找到新数据在L1层的插入点。
  2. 使用随机化决策模块来决定新插入数据的索引列的高度x。
  3. 插入高度为x的列,并维护跳跃表的结构。

例如,现在我们要插入节点10

首先我们找到节点10在L1层中的插入位置,如下图所示,我们知道节点10应该插入到节点9后面

接着我们执行了随机化决策模块,得到新插入数据的索引列的高度为5。

最后我们插入高度为5的列,并维护跳跃表的结构。

五.跳跃表的删除操作

删除操作分为以下三个步骤:

  1. 在跳跃表中查找到这个元素的位置,如果未找到,则退出 
  2. 将该元素所在整列从表中删除 
  3. 将多余的“空链”删除 

例如,我们现在要删除元素10,首先找到了这个元素的位置

接着将元素10所在整列从表中删除,并且此时最高层L5变成了空链。

最后,将多余的“空链”删除

六.补充

上面实现的跳跃表:

  1. 可以插入重复key,并且先插入的key更靠近头结点。
  2. 删除key结点的时候会把具有该key值的所有结点删掉。
  3. 若待查找的key有多个的时候,查找返回的结果是具有最高索引层数的key,若最高索引层数也相同,则返回更靠近头结点的key。

什么是跳跃表。跳跃表的原理及其实现。相关推荐

  1. [Redis6]跳跃表(跳表)

    跳跃表(跳表) 简介 有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等.对于有序集合的底层实现,可以用数组.平衡树.链表等.数组不便元素的插入.删除:平衡树或红黑树虽然效率高但结 ...

  2. mysql大表修改表名原理_MySQL修改大表工具pt-online-schema-change原理

    MySQL修改大表工具pt-online-schema-change的使用限制: 1).如果修改表有外键,除非使用 –alter-foreign-keys-method 指定特定的值,否则工具不予执行 ...

  3. 广义表的学习(原理和代码)

    广义表的学习(原理和代码) 参考链接: https://blog.csdn.net/it_is_me_a/article/details/99870530

  4. 学生表 成绩表 课程表 教师表

    学生表: Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 课程表: Course(c_id,c_name,t_id) – –课程编号, ...

  5. mysql新建表96k_innodb表 手工导入导出

    上一篇文章介绍了"innobackupex 热备指定库表操作",分析其整个过程,就是将表的字典和数据文件导出在导入的原理,那么针对单表的备份与恢复(新实例或者新库中恢复),我们可以 ...

  6. 【数据库】第一章 数据库的分类、SQL、数据库、表和表记录的常用操作

    [数据库]第一章 数据库的分类.SQL.数据库与表的常用操作 文章目录 [数据库]第一章 数据库的分类.SQL.数据库与表的常用操作 一.数据库的分类 1.关系型数据库 2.非关系型数据库 3.MyS ...

  7. sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区

    sql server表分区 The idea behind this article is to discuss the importance and the implication of SQL P ...

  8. 【hive】数据倾斜-大表小表join优化mapjoin

    真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题 0.Hive中的优化分类    真正想要掌握Hive的优化,要熟悉相关的MapReduce,Yarn,hdfs底层源 ...

  9. E002-CRC查表法-表的由来与实现1

    一.背景 CRC计算中常用空间换时间的方案即查表法,从前面的文章关于CRC的介绍中不难知道,crc的表其实就是对于整个字节256个数据的不同结果记录的集合. 1. 本文主要针对CRC16查表法表的计算 ...

  10. 创建学院表 学生表 教师表 课程表 选课记录表

    为什么要使用数据库 解决数据持久化问题 高效的管理数据(增删改查) 数据库的分类: 关系型数据库 理论基础:关系代数 具体表象:二维表 行:记录 列:字段 编程语言:SQL(结构化查询语言) DDL ...

最新文章

  1. 【JS】两种计时器/定时器
  2. 在VS中巧用文件系统来发布网站
  3. POJ_1253胜利的大逃亡
  4. Java魔法堂:初探MessageFormat.format和ChoiceFormat
  5. 写一个简单的实时互动小游戏
  6. python怎么查看安装了哪些库_如何查看Python 安装位置以及已经安装的库
  7. Spring Boot Web相关配置
  8. java 人脸识别 性别识别
  9. Docker部署AI算法教程
  10. SSM框架讲解(史上最详细的文章)
  11. 机器学习_深度学习毕设题目汇总——图像分类
  12. 华为薪资等级结构表_华为公司等级薪酬制度
  13. 激光雷达应用技术分析
  14. STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)
  15. 一步步认识jdk 我们的朋友 之Arrays
  16. iOS 图像选取器UIImagePickerController
  17. 大型网站技术架构-读后感
  18. Java面试题——数据库的优化
  19. 彩色宝石项链C/C++解决
  20. python实现三级菜单_Python3.5实现的三级菜单功能示例

热门文章

  1. unity案例星际迷航_《星际迷航》:自1964年以来启发人们和他们的技术
  2. C# 输入一个正整数N,判断N是奇数还是偶数,输出1~N的奇数和或是偶数和,三种不同方法分别实现
  3. debian 7 网络安装后无法联接wifi
  4. 这篇python正则表达式颠覆你的人生观,详细到让你怀疑人生!
  5. 企业流程再造(BPR)
  6. html编写在线打字通,前端代码练习 - 在线打字测试(dazi.kukuw.com)
  7. 利用ROUNDUP函数进行内存对齐
  8. Educational Codeforces Round 97 (Rated for Div. 2) F. Emotional Fishermen
  9. 计算机arp 各命令,ARP命令参数详解
  10. react学习—Reducer Hook