跳跃表详解

news2024/9/28 1:21:46

跳跃表[SkipList]是一种基于有序链表的扩展,简称跳表,其就是使用关键节点作为索引的一种数据结构

怎样能更快查找到一个【有序链表】的某一节点呢?

可以利用类似【索引】的思想,提取出【链表】中的【部分关键节点】

比如:给定一个长度是7的有序链表,节点值依次是1->2->3->5->6->7->8 那么我们可以取出所有值为【奇数的节点】作为关键点。

此时如果要插入一个值是4的新节点,不再需要和原节点8,7,6,5,3逐一比较,只需要比较关键节点7,5,3

 

确定了【新节点在关键节点中的位置】(3和5之间),就可以【回到原链表】,迅速定位到对应的位置插入(同样是3和5之间)

 

 

多层关键节点多层索引

当然,既然已经提取出了【一层关键节点】作为【索引】,那么可以进一步提取索引,提出一层索引的索引

 

有了2级索引之后,新的节点可以先和2级索引比较,确定大体范围; 然后再和1级索引比较;最后再回到原链表,找到并插入对应位置

层级极限是什么?

当节点足够多的时候,不止能提出2层索引,还可以向更高层次提取,保证每一层是上一层节点数的【一半】至于提取的【极限】,则是:

同一层只有【两个节点】的时候,因为一个节点没有比较的意义。

这样的【多层链表】结构,就是所谓的【跳跃表】

怎么从新节点当中选取一部分提到上一层(抛硬币法)?

当大量的新节点通过逐层比较,最终插入到原链表之后,上层的索引节点会渐渐变得不够用。

这时候需要从新节点当中选取一部分提到上一层。

使用【抛硬币】 也就是随机决定新节点是否提拔,每次向上提拔一层的几率是50%

为什么要用抛硬币?

①. 因为跳跃表删除和添加的节点是不可预测的,很难用一种有效的算法来保证跳表的索引部分始终均匀。

②. 随机抛硬币的方法虽然不能保证索引绝对均匀分布,却可以让大体趋于均匀

跳跃表【插入节点】的流程?

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

2. 把新节点插入到原链表。O(1)

3. 利用抛硬币的随机方式,决定新节点是否提升为上一级索引。

结果为“正”则提升并继续抛硬币,结果为“负”则停止。O(logN)

删除节点的步骤:

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

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

跳跃表和二叉查找树的区别?

跳跃表的优点:

维持【结构平衡】的成本比较低,完全依靠【随机】

二叉查找树:

在多次插入、删除后,需要rebalance来重新调整结构平衡

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

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

相关文章

bean的实例化和初始化

Instantiation:表示实例化,对象还未生成 Initialization:表示初始化,对象已经生成 InstantiationAwareBeanPostProcessor继承自BeanPostProcessor,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所…

VS Code 安装

前端开发工具 VSCodeHBuildersublimeWebStorm VS Code 一、介绍 Visual Studio Code(简称 VS Code )是 Microsoft 于2015年4月发布的一款代码编辑器。VS Code 对前端代码有非常强大的支持,同时也其他编程语言(例如&#xff1a…

20年运维老兵,SRE领域大咖张观石揭秘FinOps体系实践方法

当前,降本增效成为各大互联网公司的重要方向,IT成本则占据了互联网成本的大头。随着IT资源成本花费越来越高,很多公司意识到掌握管控成本和优化成本的重要性。 如何有效的降本?如何做好成本的洞察管控?如何掌握资源成…

ECDH 算法

一、简介 ECDH全称是椭圆曲线迪菲-赫尔曼秘钥交换(Elliptic Curve Diffie–Hellman key Exchange),主要是用来在一个不安全的通道中建立起安全的共有加密资料,一般来说交换的都是私钥,这个密钥一般作为“对称加密”的…

STM32速成笔记—IWDG

文章目录 一、IWDG简介二、STM32的IWDG2.1 STM32的IWDG简介2.2 喂狗2.3 IWDG框图 三、IWDG配置步骤四、IWDG配置程序4.1 IWDG初始化程序4.2 喂狗 五、应用实例 一、IWDG简介 独立看门狗(Independent Watchdog, IWDG),什么是看门狗&#xff1…

【二叉树part06】| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录 🎈LeetCode654.最大二叉树 🎈LeetCode617.合并二叉树 🎈LeetCode700. 二叉搜索树中的搜索 🎈LeetCode98. 验证二叉搜索树 🎈LeetCode654.最大二叉树 链接:654.最大二叉树 给定一个不重复的整数数…

林客本地生活商城小程序开发

本地生活商城小程序的市场前景非常广阔。近年来,随着移动互联网技术的普及和人们消费观念的变化,越来越多的消费者开始通过手机进行线上购物。本地生活商城小程序恰好满足了用户对于便捷、快速、个性化购物体验的需求,具有以下优势&#xff1…

1752_使用Perl实现目录遍历

全部学习汇总: GreyZhang/speed_emacs: Try to make a new emacs configuration which is fast even on windows! (github.com) 关于Perl和Python的优劣我不去做什么分析,也不去发表什么深入的见解。我个人的学习过程是先Perl后Python再回到Perl。因为工…

【2023.6.26】记达梦数据库基于信创服务器麒麟OS报错与优化

一、场景描述 OS:银河麒麟V10(GUI)CPU:鲲鹏920达梦数据库:V8 (基于平台信创:麒麟V10、鲲鹏架构)金蝶中间件:V9 二、达梦数据库报错记录 报错1:(SWT:18564&…

基于Java削面快餐店点餐服务系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

cmd中输入npm install,回车——安装node modules依赖,出现报错的【解决方法】

目录 1.正常情况是: 2.当前问题: 3.解决方法: 当拿到一个前端项目的代码文件夹的时候,想要启动项目。 如果项目的代码文件夹里面没有node modules文件夹: 需要打开cmd,然后在里面输入 npm install (可…

c++初始化列表和静态成员

文章目录 一、初始化列表二、静态(static)成员 一、初始化列表 类对于成员变量的赋值有两种方式 函数体内赋值初始化列表 函数体内赋值就是直接在构造函数中赋值即可,而初始化列表它是较为特殊的一种方式! 初始化列表是在构造函数()之后以:开始,然后后…

查询穿梭框实现

技术栈: 使用vue3 的composition api 和 tsx 进行开发 一、需求描述 点击编辑,显示穿梭框: 可将左侧维度拖动至右侧,已选维度可上下拖动调整顺序。 二、需求分析 1、状态传递过程 我们首先来分析一下,整个流程中的…

魔改xxl-job,彻底告别手动配置任务!自动注册xxljob定时任务

xxl-job是一款非常优秀的任务调度中间件,轻量级、使用简单、支持分布式等优点,让它广泛应用在我们的项目中,解决了不少定时任务的调度问题。 我们都知道,在使用过程中需要先到xxl-job的任务调度中心页面上,配置执行器…

WiFi模块测试|高通QCA9531方案WiFi模块网页配置说明-SKW99/SKW100

本篇以高通QCA9531方案无线路由WiFi模块SKW99为例,简单介绍 高通方案无线路由WiFi模块的软件使用。友情提示:多图,请在WiFi环境下阅读。 以SKW99为例,在SKW99规格书找到模块系统框图、PIN脚图及各个PIN脚的描述定义;之…

AutoSAR系列讲解(入门篇)3.4-RTE对Ports的支撑(下)

一、C/S接口的实现 之前在第二章AppL中讲过了C/S接口,这里再更加深入的说明一下其实现的原理:首先,C/S接口就是客户/服务接口,这个接口就是客户来调用服务 端的操作的一个接口。也就是我写着写着,发现我想要调用一个函…

【Figma技巧】布尔变量控制图层显隐

用2023年6月22日更新的Figma最新功能,实现按钮控制图层显隐的交互。 实现效果 步骤 1. 创建本地变量 点击右侧面板中的Local variables弹出变量面板,点击底部Create variable按钮,创建一个Boolean布尔变量。 本案例中,我需要分…

从0开始Jmeter接口测试实战

在之前的文章中给大家介绍过接口测试文档和接口测试用例示例,本文基于Jmeter工具给大家介绍一下如何实现接口测试用例:包括发起Http请求,绕过登陆,验证响应。JMeter是Apache组织开发的基于Java的压力测试工具。具有开源免费、框架…

Python|Pyppeteer操作浏览器,弹出文件选择框,实现自动选择“指定文件”(14)

前言 本文是该专栏的第14篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 使用pyppeyeer操作浏览器的时候,可能有时候会遇到这样的情况,如下图所示: 通过程序脚本自动点击某个按钮之后,触发一个弹出框,需要输入对应的文件路径。经验丰富的同学,可能会想到…

深入浅出 - 单例模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…