跳表原理笔记
课程地址
跳表是一种基于随机化的有序数据结构,它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力
创建
首先在头部创建一个 sentinel 节点,然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层
例如上图中,L0 层的节点2,10,11,13,20,26 都增长到了 L1 层。继续采用抛硬币的方式,来决定 L1 层的指针是否增长到 L2 层
例如上图中,L1 层的节点2,13,26 都增长到了 L2 层。继续采用抛硬币的方式,来决定 L2 层的指针是否增长到 L3 层
例如上图中,L2 层的节点 13 增长到了 L3 层。至此我们停止层数增长,层数一般定为 logn 层
所以 L0 层保存了原始数据,逐个串联。L1 层平均每次跳过 1 个,L2 层平均每次跳过 2 个,L3 层平均每次跳过 4 个
跳跃相当于快速通道,使我们得以快速确定查找的元素是否在当前区间中
查找
首先查找 key = 13,从 L3 层开始查找,第一个节点的值就是 13,直接找到了
然后查找 key = 8,从 L3 出发,第一个节点的值是 13,大于 8,则从 Sentinel 向下走一层到 L2
从 L2 的 Sentinel 出发,第一个节点的值是 2,小于 8,则继续向后走一步,下一个节点的值是 13,大于 8,则从 L2 的第一个节点(2)向下走一层到 L1
从 L1 的第一个节点(2)出发,下一个节点的值是 10,大于 8,则从 L1 的第一个节点(2)向下走一层到 L0
从 L0 的第一个节点(2)出发,下一个节点的值是8,则找到了
然后查找 key = 20,从 L3 的 Sentinel 出发,下一个节点的值是 13,小于 20,因为 13 节点已经是最后一个节点,不能再往后走,所以向下走一层到 L2
从 L2 的第二个节点(13)出发,下一个节点的值是 26,大于 13,则向下走一层到 L1 层
从 L1 层的第 4 个节点出发,下一个节点的值是 20,则找到了
最后一个查找的例子是查找 key = 21,从 L3 的 Sentinel 出发,下一个节点的值是 13,小于 21,因为 13 节点已经是最后一个节点,所以向下走一层到 L2
从 L2 的第二个节点(13)出发,下一个节点的值是 26,大于 13,则向下走一层到 L1 层
从 L1 层的第 4 个节点出发,下一个节点的值是 20,小于 21,则向后走一步到 26,大于 21,则从 20 向下走一步到达 L0 层
从 L0 层的第 7 个节点(20)出发,下一个节点的值是 22,已经大于 21,因为 L0 已经是最底层,所以 20 和 22 之间没有其他节点,故 key = 21 不存在
新增
首先需要确定新节点的插入位置,这个过程跟查找是一致的,上图中红色箭头就表示新节点需要插入到这个范围内
同时使用一张哈希表记录下每个红色箭头的起点(指针)
接下来创建一个新节点,它的指针域采用“抛硬币”的方式决定是否向上层增长:如果正面朝上就增加一层,如果反面朝上就终止这个过程,那么新节点的高度会以指数的方式快速收敛。例如上图中,新节点 9 就是抛了 2 次硬币都正面朝上,第三次反面朝上
最后,借助表中记录的指针,将新的节点插入到跳表中
跳表 vs B+树
相关文章:

跳表原理笔记
课程地址 跳表是一种基于随机化的有序数据结构,它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点,然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中,L…...

计算机毕业设计Hadoop+PySpark深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
AI开发-三方库-torch-torchvision
1 需求 数据集:torchvision.datasets torchvision.datasets.MNIST数据变换:torchvision.transforms torchvision.transforms.Composetorchvision.transforms.ToTensortorchvision.transforms.Normalize模型:torchvision.models可视化工具&…...
解析 MySQL 数据库容量统计、存储限制与优化技巧
管理 MySQL 数据库时,了解数据库中的数据量和存储占用情况是非常重要的,尤其是在面对大规模数据时。无论是为了优化数据库性能,还是为了进行容量规划,准确地统计数据库的容量可以帮助我们做出更好的决策。mysql的客户端工具是Navi…...
智能工厂的软件设计 思维进阶与数学程序
本文要点 讨论 “智能工厂的软件设计”中的“数学程序”。 这里 “数学程序” 是指能“格物致知”来理解“相续”一词。 完整的表述是: 思想素养提升的 思维进阶法(三种 数学程序 : 格物致知 )之思维导图: 二叉树及其…...
技术速递|GitHub Copilot upgrade assistant for Java 技术预览发布!
作者:Nick Zhu - Senior Program Manager 排版:Alan Wang 随着人工智能和大型语言模型(LLMs)的不断发展,Agent(“智能代理”)和智能代理化工作流程正在迅速成为AI领域的下一个前沿。这些自主系统…...
淘宝有哪些API是用来获取商品列表的?(商品id列表)
淘宝商品详情接口item_get是通过商品id或者商品链接来获取商品详情数据的,但是不少客户是没有商品id的,这时需要通过接口来拿到商品id。 可以获取商品id的API有: item_search 通过关键字搜索商品列表 item_search_shop 获取店铺所有商品列…...

D59【python 接口自动化学习】- python基础之异常
day59 捕获异常常见问题 学习日期:20241105 学习目标:异常 -- 75 避坑指南:编写捕获异常程序时经常出现的问题 学习笔记: 捕获位置设置不当 设置范围不当 捕获处理设置不当 嵌套try-except语法错误 总结 位置,范围…...
解决 Spring 异步处理中的 JDK 动态代理问题及相关错误分析
解决 Spring 异步处理中的 JDK 动态代理问题及相关错误分析 遇到的问题: 在使用 Spring 的 Async 注解开启异步处理时,遇到以下错误: The bean ServiceImplChannel could not be injected as a com.wn.order.pay.recharge.controller.Serv…...

从xss到任意文件读取
xss一直是一种非常常见且具有威胁性的攻击方式。然而,除了可能导致用户受到恶意脚本的攻击外,xss在特定条件下还会造成ssrf和文件读取,本文主要讲述在一次漏洞挖掘过程中从xss到文件读取的过程,以及其造成的成因。 0x01 前言 xss一…...
nuiapp vue3 uni-ui uni.uploadFile 图片上传
<div style"position: relative;margin-top: 0.8em;"> <div style"position: absolute;left: 1.5em;top: 2em;">施工图片</div> <div style"position: absolute; left: 7em;top: 0em;right: 0em;bottom…...
【计算机科学】位运算:揭开二进制世界的奥秘
位运算是计算机运算的一种基础操作,直接作用于数据的二进制位(bit),在计算机中具有极高的效率。无论是编写高效算法,还是进行底层开发,位运算都扮演着重要角色。本文将从位运算的起源、常见操作符、应用场景…...
弹性裸金属服务器和传统裸金属服务器有什么区别?
弹性裸金属服务器是一种结合了传统裸金属服务器和云计算资源两种特点的服务器,是一种云计算服务,下面我们就来了解一下弹性裸金属服务器和传统裸金属服务器之间有什么区别吧! 弹性裸金属服务器能够支持企业快速部署新的硬件和软件系统&#x…...

shodan(五)连接Mongodb数据库Jenkinsorg、net、查看waf命令
声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人一律不承担一切后果 引言: 1.Shodan 是一个专门用于搜索连…...

ThingsBoard规则链节点:Push to Edge节点详解
引言 1. Push to Edge 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 边缘计算 3.2 本地数据处理 3.3 实时响应 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台,提供了设备管…...

基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力
作者:肯梦 本文将演示如何使用事件总线(EventBridge),向量检索服务(DashVector),函数计算(FunctionCompute)结合灵积模型服务 [ 1] 上的 Embedding API [ 2] ࿰…...

【golang/navmesh】使用recast navigation进行寻路
目录 说在前面安装使用可视化 说在前面 go version:1.20.2 linux/amd64操作系统:wsl2detour-go版本:v0.2.0github:这里,求star! 安装 使用go mod安装即可go get github.com/o0olele/detour-go使用 使用场景模型构建n…...

【软考】Redis不同的数据类型和应用场景。
Redis的不同数据类型和对应的应用场景: Redis 数据类型及其应用场景 String(字符串) 特点:简单的值存储,支持二进制数据。应用场景: 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量࿰…...
java 对人名和电话 脱敏-replaceAll
学习了《正则匹配人名》和《正则匹配电话号码》,如果要一起进行脱敏处理,改怎么做? 脱敏的,考虑配置规则,进行匹配的方式进行处理: 脱敏规则: DesensitizationRules Data public class Desens…...

计算机网络:网络层 —— 网络地址转换 NAT
文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...