python实现跳跃表

跳跃表(Skip List)是一种基于链表的数据结构,它通过多级索引实现了高效的查找、插入和删除操作。跳跃表是一种随机化的数据结构,其预期性能与平衡二叉搜索树相近,但实现更为简单。

一、基本概念
跳跃表由多层链表组成,其中每一层都是一个有序的链表。最底层(Level 0)包含所有元素,每一层的元素都是下一层元素的子集。通过多层索引,跳跃表可以在期望时间内高效地进行查找、插入和删除操作。

二、跳跃表的结构
跳跃表的每一个节点包含以下信息:

值:节点存储的实际数据。
指针数组:每个节点包含一个指针数组,用于指向不同层次上的下一个节点。
跳跃表的高度是随机确定的,这使得插入操作具有随机性。

三、跳跃表的操作

  1. 查找操作
    跳跃表的查找操作通过从上层逐层向下查找目标节点:

从最高层的链表开始,查找不超过目标值的最大节点。
如果该节点不是目标节点,则进入下一层继续查找。
重复以上步骤,直到在最底层找到目标节点或确认目标节点不存在。
查找操作的时间复杂度是 O(logn),其中 n 是跳跃表中的节点数。
2. 插入操作
插入操作类似于查找操作,但需要额外插入节点并更新相关指针:

从最高层开始,找到新节点应该插入的位置。
在每一层中插入新节点,并更新相关指针。
新节点的高度由随机函数决定,保证跳跃表的高度期望值为 O(logn)。
3. 删除操作
删除操作也类似于查找操作,需要移除节点并更新相关指针:

从最高层开始,找到要删除节点的位置。
在每一层中删除节点,并更新相关指针。
四、跳跃表的实现

  1. 定义节点类
import randomclass Node:def __init__(self, value, level):self.value = valueself.forward = [None] * (level + 1)  # 指针数组
  1. 定义跳跃表类
class SkipList:def __init__(self, max_level):self.max_level = max_levelself.header = Node(None, max_level)  # 头节点self.level = 0  # 当前层数def random_level(self):level = 0while random.random() < 0.5 and level < self.max_level:level += 1return leveldef insert(self, value):update = [None] * (self.max_level + 1)current = self.headerfor i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]update[i] = currentlevel = self.random_level()if level > self.level:for i in range(self.level + 1, level + 1):update[i] = self.headerself.level = levelnew_node = Node(value, level)for i in range(level + 1):new_node.forward[i] = update[i].forward[i]update[i].forward[i] = new_nodedef search(self, value):current = self.headerfor i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]current = current.forward[0]if current and current.value == value:return Truereturn Falsedef delete(self, value):update = [None] * (self.max_level + 1)current = self.headerfor i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]update[i] = currentcurrent = current.forward[0]if current and current.value == value:for i in range(self.level + 1):if update[i].forward[i] != current:breakupdate[i].forward[i] = current.forward[i]while self.level > 0 and self.header.forward[self.level] is None:self.level -= 1

五、跳跃表的性能分析
查找复杂度:跳跃表的查找操作在期望时间内是 O(logn),因为它通过多层索引有效地减少了需要遍历的节点数。
插入复杂度:插入操作的期望时间复杂度也是 O(logn),因为随机层次决定了节点插入的位置。
删除复杂度:删除操作与查找操作类似,因此其时间复杂度也是 O(logn)。
六、跳跃表的优点和缺点
优点
实现简单:相比平衡二叉树,跳跃表的实现相对简单。
高效查找:通过多层索引,跳跃表能够高效地进行查找操作。
动态调整:插入和删除操作会动态调整索引层次,不需要复杂的旋转或重平衡操作。
缺点
空间开销:由于维护多层索引,跳跃表需要额外的存储空间。
随机性:跳跃表的性能依赖于随机函数,如果随机性不够理想,性能可能受到影响。
七、应用场景
跳跃表适用于以下场景:
需要高效查找、插入和删除操作的应用:如缓存系统、内存数据库等。
实现简单的动态数据结构:跳跃表比平衡树实现更简单,适合开发快速原型。
并发操作:跳跃表可以自然地支持并发操作,通过锁或无锁编程进一步提高性能。
跳跃表是一种非常有效的数据结构,在需要高效查找、插入和删除操作的应用中广泛使用。通过合理的实现和配置,跳跃表可以提供接近于平衡二叉树的性能,同时具备更简单的实现和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 简化线程Isolate的使用

文章目录 前言一、完整代码二、使用示例1、通过lambda启动线程2、获取线程返回值3、线程通信4、结束isolate 总结 前言 flutter的线程是数据独立的&#xff0c;每个线程一般通过sendport来传输数据&#xff0c;这样使得线程调用没那么方便&#xff0c;本文将提供一种支持lambd…

音频处理1_基本概念

AI变声和音乐创作的基础 声音本质上是人类可察觉范围内的气压周期性波动, 即声波 声波是一种连续信号&#xff0c;在任意时间内的声音信号有无数个取值。对于只能读取有限长数组计算机来说&#xff0c;我们需要将连续的声音信号转换为一个离散的序列&#xff0c;即数字化表示。…

法考报名必看,99%高过审率证件照片电子版制作技巧

在2024年&#xff0c;法考备战已经如火如荼进行中&#xff0c;作为进入法律行业的第一步&#xff0c;参加法考的重要性不言而喻。而作为报名过程中必不可少的一环&#xff0c;报名照片要求以及证件照制作技巧更是需要我们特别重视的部分。想要在这个过程中顺利通过审核&#xf…

【全开源】图书借阅管理系统源码(ThinkPHP+FastAdmin)

&#x1f4da;图书借阅管理系统&#xff1a;打造你的私人图书馆 一款基于ThinkPHPFastAdmin开发的简易图书借阅管理系统&#xff0c;一款轻量级的图书借阅管理系统&#xff0c;具有会员管理&#xff0c;图书管理&#xff0c;借阅及归还管理&#xff0c;会员充值等基本功能&…

7-1 后序和中序构造二叉树

分数 5 作者 唐艳琴 单位 中国人民解放军陆军工程大学 本题目要求用后序序列和中序序列构造一棵二叉树&#xff08;树中结点个数不超过10个&#xff09;&#xff0c;并输出其先序序列。 输入格式: 在第一行中输入元素个数。 第二行中输入后序序列&#xff0c;用空格分隔。…

使用 PNPM 从 0 搭建 monorepo,测试并发布

1 目标 通过 PNPM 创建一个 monorepo&#xff08;多个项目在一个代码仓库&#xff09;项目&#xff0c;形成一个通用的仓库模板。 这个仓库既可以用于公司存放和管理所有的项目&#xff0c;也可以用于将个人班余的所有积累整合其中。 这里以在 monorepo 项目中搭建 web compon…

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的MPAM

安全之安全(security)博客目录导读 关于RME的MPAM变化的完整定义见在《Arm Architecture Reference Manual Supplement, Memory System Resource Partitioning and Monitoring (MPAM), for A-profile architecture》中详细说明。 实现RME的处理元件(PE)能够生成一个2位的MPAM_…

x64-linux下在vscode使用vcpkg

1.使用vscode远程连接上对应的linux &#xff0c;或者直接在图形化界面上使用。 2.安装vcpkg 插件&#xff0c;然后打开插件设置。 注意&#xff1a;defalut和host的主机一定和你自己的主机一致&#xff0c;且必须符合vcpkg三元组格式&#xff0c;其中你可以选择工作台的设置&a…

揭秘!5大策略让广告变现长久有效

在数字化时代的浪潮下&#xff0c;广告变现作为自媒体和APP开发者重要的收入来源&#xff0c;越来越受到重视。 但如何让这种变现方式长久持续&#xff0c;成为许多内容创作者与平台运营者思考的问题。 本文旨在探讨广告变现的持久之道&#xff0c;通过分析前端展示、合规性、…

OpenCV特征匹配

1、OpenCV Brute-Force匹配器 Brute-Force匹配器的匹配方法非常简单&#xff0c;输入两张图像所分别对应的特征&#xff08;特征点坐标与特征点域对应的描述子&#xff09;&#xff0c;循环遍历两幅图像中的特征&#xff0c;计算第一幅图像与第二幅图像之间每个特征点之间的距…

【日记】第一次养植物,没什么经验……(781 字)

正文 前两天梦见灵送的几盆植物全都死掉了。梦里好伤心。醒来与她说这件事&#xff0c;她宽慰我说&#xff0c;梦都是反着的&#xff0c;肯定能活得很好的。于是忽然记起昨天给植物换水时&#xff0c;文竹的根居然从花盆底部伸吊了出来&#xff0c;以前都没有这种情况来着&…

ArcGIS Pro 3.0加载在线高德地图

1、打开ArcGIS Online官网&#xff0c;登录自己的账号&#xff0c;登录后效果如下图所示 官网地址&#xff1a;https://www.arcgis.com/home/webmap/viewer.html 2、点击Add&#xff0c;选择Add Layer from Web&#xff0c;如下图所示 3、在显示的Add Layer from Web页面内&am…

RabbitMQ-Stream(高级详解)

文章目录 什么是流何时使用 RabbitMQ Stream&#xff1f;在 RabbitMQ 中使用流的其他方式基本使用Offset参数chunk Stream 插件服务端消息偏移量追踪示例 示例应用程序RabbitMQ 流 Java API概述环境创建具有所有默认值的环境使用 URI 创建环境创建具有多个 URI 的环境 启用 TLS…

c#调用c++dll方法

添加dll文件到debug目录&#xff0c;c#生成的exe的相同目录 就可以直接使用了&#xff0c;放在构造函数里面测试

PostgreSQL的扩展(extensions)-常用的扩展-pg_stat_monitor

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展-pg_stat_monitor pg_stat_monitor 是 PostgreSQL 的一个扩展&#xff0c;它提供了一种先进的监控和统计 SQL 查询的方式&#xff0c;相比于标准的 pg_stat_statements&#xff0c;它提供了更丰富和详细的查询统…

手机流畅运行470亿参数大模型,上交大发布PowerInfer-2推理框架,性能提升29倍

苹果一出手&#xff0c;在手机等移动设备上部署大模型迅速成为行业焦点。 目前&#xff0c;移动设备上运行的模型相对较小&#xff08;苹果的是3B&#xff0c;谷歌的是2B&#xff09;&#xff0c;并且消耗大量内存&#xff0c;这在很大程度上限制了其应用场景。 即使是苹果&…

linux中: IDEA 由于JVM 设置内存过小,导致打开项目闪退问题

1. 找到idea安装目录 由于无法打开idea&#xff0c;只能找到idea安装目录 在linux(debian/ubuntu)中idea的插件默认安装位置和配置文件在哪里? 默认路径&#xff1a; /home/当前用户名/.config/JetBrains/IntelliJIdea2020.具体版本号/options2. 找到jvm配置文件 IDEA安装…

MNIST手写字符分类-卷积

MNIST手写字符分类-卷积 文章目录 MNIST手写字符分类-卷积1 模型构造2 训练3 推理4 导出5 onnx测试6 opencv部署7 总结 在上一篇中&#xff0c;我们介绍了如何在pytorch中使用线性层ReLU非线性层堆叠的网络进行手写字符识别的网络构建、训练、模型保存、导出和推理测试。本篇文…

北京Web前端薪资揭秘:从行业趋势到个人成长

北京Web前端薪资揭秘&#xff1a;从行业趋势到个人成长 在科技飞速发展的今天&#xff0c;Web前端作为互联网行业的核心岗位之一&#xff0c;其薪资水平一直备受关注。尤其是在北京这样的一线城市&#xff0c;Web前端工程师的薪资更是成为了人们热议的话题。那么&#xff0c;北…