当前位置: 首页 > news >正文

跳表论文解读

跳表出现背景:

利用二叉树可以表示各种抽象数据类型,比如字典(TreeMap)和有序列表.当元素是随机插入时,这种数据结构可以拥有很好的性能.但当元素是大量顺序插入时,这种数据结构会退化为线性时间复杂度.解决这种问题的一种方法是打乱元素顺序,但这样做在要求快速响应的场景下十分吃力.因此出现了平衡树的概念,平衡树通过不断平衡左右子树的高度来确保优秀的性能.而跳表,可以作为一种基于概率的平衡树的替代品,并且它拥有更简单的操作

跳表的实现思路:

考虑一种有序链表:
在这里插入图片描述
在这样一个链表中查找元素的时间复杂度为O(n).然而,当我们每两个节点都有额外加上的一个指针,这个指针指向它前面两个节点处的位置,即
在这里插入图片描述

那么在这样一条链表上查找元素的时间复杂度为O(n/2+1)

如果每四个节点都有一个指向前面四个节点处位置的指针,那么查找的时间复杂度将降低为O(n/4+2)
在这里插入图片描述
.以此类推,如果每2i个节点都有一个指向前面2i位置的指针,如下图,每个(20)节点都有指向前面一个节点的指针(图中所有节点都有),每2个(21)节点都有指向前面两个位置处的指针(图中6,9,17,21,26节点有),每4(22)个节点都有指向前面四个位置处的指针(图中9,21节点有),每8(23)个节点都有指向前面八个位置处的指针(图中21节点有)
在这里插入图片描述
那么在这种链表中查找元素的时间复杂度为O(log2 n),一个拥有k个指针的节点被定义为k级节点,在这种数据结构中,50%节点 是level 1, 25% 节点是 level 2, 12.5%节点是level 3…但是,如果数据结构仅仅被设计成这样,进行查找是没有任何问题的,但进行插入和删除将变得不可实践.怎么解决这个问题呢?如果我们允许每个节点的level可以被随机选择,但是比例不变,会发生什么?那么,就有可能出现下面这种情况
在这里插入图片描述
降低了限制因素后(每个节点的level是固定的),插入和删除变得可行

跳表查找,插入,删除的具体实现

跳表的最大level被限制为小于MaxLevel这个常量,这个常量根据不同的数据量可以自由配置.而跳表的level等于此时跳表的最大level,比如一开始跳表的level是1.

首先是查找,我们通过遍历向前的指针来查找元素,指针指向的元素不能超出要搜索的元素。一旦当前指针无法取得更多进展时,搜索将向下移动一个级别。当我们无法在level 1上取得更多进展时,下一个节点必须就是要查找的节点(如果那个节点存在).下图为查找元素17所应该出现的位置
在这里插入图片描述
查找伪代码
在这里插入图片描述

插入和删除的操作与查找刚开始的步骤一致,只不过在查找的过程中需要维护一个update数组,这个数组的含义为:update[i]是在待插入/删除位置左边的所有level i节点中最右边的一个.一旦完成查找,就会对update[i]进行更新.下图展示了节点指针的更新
在这里插入图片描述
插入和删除伪代码
在这里插入图片描述

当我们插入一个节点时,会随机指派它的level,指派的方法为
在这里插入图片描述
p是一个分布因子,我们讨论的链表的p = 0.5
由于本篇只对跳表概念,原理进行入门讲解,关于p的设定和后序如何挑选search最佳开始的level,以及MaxLevel的选择, 请参考论文 Skip Lists: A Probabilistic Alternative to Balanced Trees

相关文章:

  • 1061:求整数的和与均值
  • Day04JavaWeb第四次笔记---Maven的使用
  • Unrecognized option: --no-transfer-progress
  • 加载指定 having lines separator 时max_data_processor 不起作用
  • 高薪程序员面试题精讲系列150之电商专题(上)-你们的电商项目有什么特色?是B2B还是B2C、还是C2C的?直播电商你了解吗?
  • kafka是啥?虽然很难学,但是实验入门很简单
  • MySQL8.0 索引优化-invisible index
  • 基于java仓库管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  • C++对象内存故事, 一个对象是如何由子对象来构成的?
  • 软件过程模型(软件开发模型)
  • 138-基于51单片机的教室智能照明灯控制系统光控人数检测(原理图+源程序+元件清单+PCB)
  • PIE-Engine教程—中国降水分布可视化加载以2018年为例(含图例添加)
  • C#基础进阶
  • 国际聋人周 | 聋健人群无界融合,看见手语的力量
  • SCI英文文献模板/查看SCI论文分区/tex模板的使用
  • C++11: atomic 头文件
  • iOS | NSProxy
  • Java小白进阶笔记(3)-初级面向对象
  • js继承的实现方法
  • js学习笔记
  • node入门
  • SegmentFault 2015 Top Rank
  • SwizzleMethod 黑魔法
  • Vue UI框架库开发介绍
  • 记一次和乔布斯合作最难忘的经历
  • 利用jquery编写加法运算验证码
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 译自由幺半群
  • 源码安装memcached和php memcache扩展
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (三)终结任务
  • (四)模仿学习-完成后台管理页面查询
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)为C# Windows服务添加安装程序
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Micro Framework初体验
  • .Net Web项目创建比较不错的参考文章
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .pyc文件是什么?
  • ??myeclipse+tomcat
  • @Bean有哪些属性
  • @Responsebody与@RequestBody
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Angularjs]ng-select和ng-options
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [ESP32 IDF]web server
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [Gamma]阶段测试报告
  • [Java、Android面试]_05_内存泄漏和内存溢出