什么是跳跃表。跳跃表的原理及其实现。
目录
一.跳跃表的概述
二.跳跃表的定义
三.跳跃表的查找操作
四.跳跃表的插入操作
五.跳跃表的删除操作
六.补充
一.跳跃表的概述
话不多说,增加了向前指针的链表就叫作跳跃表。那么跳跃表和普通的单链表有什么区别呢?
我们知道, 在单链表中查询一个元素的时间复杂度为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),且还要往下移动的话,则输出查询失败
一定注意,不是和当前元素比较,是和当前元素的下一元素比较。
四.跳跃表的插入操作
跳跃表的插入操作可以分解为以下三步:
- 首先查找到新数据在L1层的插入点。
- 使用随机化决策模块来决定新插入数据的索引列的高度x。
- 插入高度为x的列,并维护跳跃表的结构。
例如,现在我们要插入节点10
首先我们找到节点10在L1层中的插入位置,如下图所示,我们知道节点10应该插入到节点9后面
接着我们执行了随机化决策模块,得到新插入数据的索引列的高度为5。
最后我们插入高度为5的列,并维护跳跃表的结构。
五.跳跃表的删除操作
删除操作分为以下三个步骤:
- 在跳跃表中查找到这个元素的位置,如果未找到,则退出
- 将该元素所在整列从表中删除
- 将多余的“空链”删除
例如,我们现在要删除元素10,首先找到了这个元素的位置
接着将元素10所在整列从表中删除,并且此时最高层L5变成了空链。
最后,将多余的“空链”删除
六.补充
上面实现的跳跃表:
- 可以插入重复key,并且先插入的key更靠近头结点。
- 删除key结点的时候会把具有该key值的所有结点删掉。
- 若待查找的key有多个的时候,查找返回的结果是具有最高索引层数的key,若最高索引层数也相同,则返回更靠近头结点的key。
什么是跳跃表。跳跃表的原理及其实现。相关推荐
- [Redis6]跳跃表(跳表)
跳跃表(跳表) 简介 有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等.对于有序集合的底层实现,可以用数组.平衡树.链表等.数组不便元素的插入.删除:平衡树或红黑树虽然效率高但结 ...
- mysql大表修改表名原理_MySQL修改大表工具pt-online-schema-change原理
MySQL修改大表工具pt-online-schema-change的使用限制: 1).如果修改表有外键,除非使用 –alter-foreign-keys-method 指定特定的值,否则工具不予执行 ...
- 广义表的学习(原理和代码)
广义表的学习(原理和代码) 参考链接: https://blog.csdn.net/it_is_me_a/article/details/99870530
- 学生表 成绩表 课程表 教师表
学生表: Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 课程表: Course(c_id,c_name,t_id) – –课程编号, ...
- mysql新建表96k_innodb表 手工导入导出
上一篇文章介绍了"innobackupex 热备指定库表操作",分析其整个过程,就是将表的字典和数据文件导出在导入的原理,那么针对单表的备份与恢复(新实例或者新库中恢复),我们可以 ...
- 【数据库】第一章 数据库的分类、SQL、数据库、表和表记录的常用操作
[数据库]第一章 数据库的分类.SQL.数据库与表的常用操作 文章目录 [数据库]第一章 数据库的分类.SQL.数据库与表的常用操作 一.数据库的分类 1.关系型数据库 2.非关系型数据库 3.MyS ...
- sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区
sql server表分区 The idea behind this article is to discuss the importance and the implication of SQL P ...
- 【hive】数据倾斜-大表小表join优化mapjoin
真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题 0.Hive中的优化分类 真正想要掌握Hive的优化,要熟悉相关的MapReduce,Yarn,hdfs底层源 ...
- E002-CRC查表法-表的由来与实现1
一.背景 CRC计算中常用空间换时间的方案即查表法,从前面的文章关于CRC的介绍中不难知道,crc的表其实就是对于整个字节256个数据的不同结果记录的集合. 1. 本文主要针对CRC16查表法表的计算 ...
- 创建学院表 学生表 教师表 课程表 选课记录表
为什么要使用数据库 解决数据持久化问题 高效的管理数据(增删改查) 数据库的分类: 关系型数据库 理论基础:关系代数 具体表象:二维表 行:记录 列:字段 编程语言:SQL(结构化查询语言) DDL ...
最新文章
- 【JS】两种计时器/定时器
- 在VS中巧用文件系统来发布网站
- POJ_1253胜利的大逃亡
- Java魔法堂:初探MessageFormat.format和ChoiceFormat
- 写一个简单的实时互动小游戏
- python怎么查看安装了哪些库_如何查看Python 安装位置以及已经安装的库
- Spring Boot Web相关配置
- java 人脸识别 性别识别
- Docker部署AI算法教程
- SSM框架讲解(史上最详细的文章)
- 机器学习_深度学习毕设题目汇总——图像分类
- 华为薪资等级结构表_华为公司等级薪酬制度
- 激光雷达应用技术分析
- STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)
- 一步步认识jdk 我们的朋友 之Arrays
- iOS 图像选取器UIImagePickerController
- 大型网站技术架构-读后感
- Java面试题——数据库的优化
- 彩色宝石项链C/C++解决
- python实现三级菜单_Python3.5实现的三级菜单功能示例
热门文章
- unity案例星际迷航_《星际迷航》:自1964年以来启发人们和他们的技术
- C# 输入一个正整数N,判断N是奇数还是偶数,输出1~N的奇数和或是偶数和,三种不同方法分别实现
- debian 7 网络安装后无法联接wifi
- 这篇python正则表达式颠覆你的人生观,详细到让你怀疑人生!
- 企业流程再造(BPR)
- html编写在线打字通,前端代码练习 - 在线打字测试(dazi.kukuw.com)
- 利用ROUNDUP函数进行内存对齐
- Educational Codeforces Round 97 (Rated for Div. 2) F. Emotional Fishermen
- 计算机arp 各命令,ARP命令参数详解
- react学习—Reducer Hook