SkipList 跳跃表

简介: 引子考虑一个有序表:14->23->34->43->50->59->66->72从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数为 2 + 4 + 6 = 12 次。

 

引子

考虑一个有序表:14->23->34->43->50->59->66->72

从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数

为 2 + 4 + 6 = 12 次。有没有优化的算法吗?  链表是有序的,但不能使用二分查找。类似二叉

搜索树,我们把一些节点提取出来,作为索引。

这里我们把 < 14, 34, 50, 72 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。

我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构:

如果元素足够多,这种索引结构就能体现出优势来了。

 

跳跃表 

跳表具有如下性质:

(1) 由很多层结构组成

(2) 每一层都是一个有序的链表

(3) 最底层(Level 1)的链表包含所有元素

(4) 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。

(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

其中 -1 表示 INT_MIN, 链表的最小值,1 表示 INT_MAX,链表的最大值。

跳跃表的搜索

例子:查找元素 117

(1) 比较 21, 比 21 大,往后面找

(2) 比较 37,   比 37大,比链表最大值小,从 37 的下面一层开始找

(3) 比较 71,  比 71 大,比链表最大值小,从 71 的下面一层开始找

(4) 比较 85, 比 85 大,从后面找

(5) 比较 117, 等于 117, 找到了节点。

跳跃表的插入

  1. 新节点和各层索引节点逐一比较,确定原链表的插入位置。O(logN)

  2. 把索引插入到原链表。O(1)

  3. 利用抛硬币的随机方式,决定新节点是否提升为上一级索引。结果为“正”则提升并继续抛硬币,结果为“负”则停止。O(logN)

总体上,跳跃表插入操作的时间复杂度是O(logN),而这种数据结构所占空间是2N,既空间复杂度是 O(N)。 

跳跃表的删除

  1. 自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点。O(logN) 

  2. 删除每一层查找到的节点,如果该层只剩下1个节点,删除整个一层(原链表除外)。O(logN)

总体上,跳跃表删除操作的时间复杂度是O(logN)。

 

总结 

跳跃表的优点在维持结构平衡的成本比较的,根据扔硬币,所以完全依靠随机。而二叉查找树在多次插入删除后,需要Rebalance来重新调整结构平衡。 

 

目录
相关文章
Threejs创建胶囊体
这篇文章介绍了在Three.js中创建胶囊体(两端为半球形中间为圆柱形的模型)的方法,包括建立几何体、设置材质以及将其添加到场景中的步骤。
156 1
Threejs创建胶囊体
|
11月前
|
数据安全/隐私保护 开发者
六、ArkTS 常用组件-按钮(Button)/切换按钮(Toggle)/文本输出(TextInput)
`Button` 组件是 HarmonyOS 应用开发中的基本组件之一,主要用于响应用户的点击操作。它支持两种使用方式:不包含子组件和包含子组件。不包含子组件时,`Button` 通过 `label` 属性设置按钮上的文字,同时提供 `options` 参数来配置按钮类型和点击效果;包含子组件的方式则允许更灵活的内容展示,如图片或复杂布局,此时无需设置 `label`。此外,`Button` 组件还提供了设置背景颜色、边框圆角等样式的方法,以及绑定点击事件的功能,使开发者能够轻松实现丰富的交互体验。
746 0
六、ArkTS 常用组件-按钮(Button)/切换按钮(Toggle)/文本输出(TextInput)
|
10月前
|
人工智能 编解码 搜索推荐
《鸿蒙Next:让人工智能应用自适应不同屏幕,畅享极致体验》
鸿蒙Next系统通过引入先进的自适应布局技术,支持Row、Column、Flex等组件,实现人工智能应用在不同设备上的完美显示。结合媒体查询、条件编译、矢量图和多套图片资源,确保应用在各种屏幕尺寸和分辨率下提供优质的视图与交互体验。利用AI驱动的智能识别、用户习惯学习及实时反馈机制,进一步优化自适应显示效果,为用户带来流畅、个性化体验。
509 16
|
10月前
|
小程序 IDE PHP
圈子源码如何打包生成App小程序/开发一个圈子系统软件所需要的费用体现在哪里?
将PHP源码打包成App的过程涉及多个步骤和技术选择。以圈子源码为例,首先明确需求,确定App功能和目标用户群体,并根据需求开发小程序页面,如用户注册、圈子列表等。源码准备阶段确保源码适用于小程序开发,环境配置需安装IDE(如微信开发者工具)及依赖库。最后在IDE中打包小程序并上传至管理平台,通过审核后发布。费用方面,模板开发成本较低,定制开发则更高,具体取决于需求复杂度和第三方服务费用。
350 0
ASCII编码的10个阿拉伯数字
ASCII编码的10个阿拉伯数字
3314 1
|
数据采集 存储 传感器
物联网的感知层、网络层与应用层分享
物联网的感知层、网络层与应用层分享
1033 1
|
存储 监控 安全
5 天学会阿里云 RPA:安全性与合规性
随着数字化转型的加速,机器人流程自动化(RPA)技术在各个行业中得到了广泛应用。阿里云 RPA 作为一种领先的 RPA 解决方案,不仅提供了高效的业务流程自动化能力,还高度重视安全性与合规性。在本文中,我们将深入探讨阿里云 RPA 在安全性与合规性方面的优势和措施。
Zp
HttpUtils.doPost()请求,EntityUtils.toString(response.getEntity()) 时乱码
HttpUtils.doPost()请求,EntityUtils.toString(response.getEntity()) 时乱码
Zp
515 0
|
存储 安全 程序员
阿里 Teambition 网盘测评|免费也能快到飞起
你想要的是一款不限速、不打扰、够安全、易于协作的网盘?这些需求都会被满足,但这样还不够,要让你的每一次使用都充满惊喜和愉悦。
662 0
阿里 Teambition 网盘测评|免费也能快到飞起
|
API 对象存储 开发者
AfterEffects模板云端渲染解决方案
本文介绍使用ICE高级模板渲染AfterEffects特效视频,通过组装不同的ClipsParam替换AE模板中的素材,达到视频批量生产的目的。
1123 0
AfterEffects模板云端渲染解决方案