【C++】手撕跳表

news2024/11/26 23:21:36

文章目录

  • 跳表
    • 简介
    • 时间复杂度
  • 代码实现
    • 节点类
    • 跳表类
  • 源代码(附详细注释)
  • 参考

跳表

简介

跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(示意图如下)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。
在这里插入图片描述

时间复杂度

  • 查询:O(logn)。

  • 插入

    • 查找插入位置:O(logn);
    • 插入:
      • 用链表实现:O(1);
      • 用数组实现:插入位置之后的节点向后移动一位,O(n),此时整体复杂度O(n),因为找到节点只走插入位置前面的节点的索引,后移只移动插入位置后面的节点。
  • 删除

    • 查找删除位置:O(logn);
    • 删除:同插入,但用数组实现时,后移变前移

代码实现

节点类

  • 包含三个成员变量:节点的索引列表
  • 构造节点时,根据传入的索引层数确定索引列表长度,索引列表使用vector创建;
  • 写成模板类,提高复用性;
  • 代码如下:
template<typename T>
class SkipNode {
public:
	int key;
	T value;
	vector<SkipNode*> next;
	SkipNode(int key, T value, int level);
};

跳表类

  • 成员变量:头节点尾节点列表最大层数
  • 成员函数:初始化节点层数找到指定节点层数
  • 初始化跳表(构造)时,为确保节点有序,将头尾节点分别初始化为整型最小、最大值,头节点指向尾节点(尾节点默认指向空);
  • 初始化节点索引层数时,调用正态分布的随机数生成引擎,生成随机数 0或1,若为1,生成索引并继续向上判断,直到达到最大层数,为0则立刻终止;
  • 获取指定节点索引层数,返回节点索引的大小即可;
  • 查找节点,从索引最高层开始判断,若索引指向的节点key小于target,于该层继续向右判断,否则先判断是否为要查找的节点,是则返回节点指针,否则跳到下一层开始判断。如果循环结束没有找到,返回空指针;
  • 插入和删除节点,先判断节点是否存在,存在则修改value,否则创建新节点并插相应位置(调用查询函数)。
template<class T>
class SkipList {
public:
	SkipNode<T>* head;
	SkipNode<T>* tail;
	int maxLevel;
	SkipList(int maxLevel, T iniValue);
	~SkipList() {
		delete head;
		delete tail;
	}
	
	SkipNode<T>* insert(int key, T value);
	SkipNode<T>* find(int key);
	SkipNode<T>* deleteNode(int key);

private:
	int randomLevel();
	int nodeLevel(vector<SkipNode<T>*> p);
};

源代码(附详细注释)

源代码

参考

CSDN ShenHang_

知乎 KeepUp

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

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

相关文章

代码随想录二叉树 Java(三)

文章目录 &#xff08;简单&#xff09;501. 二叉搜索树中的众数&#xff08;*中等&#xff09;236. 二叉树的最近公共祖先&#xff08;中等&#xff09;235. 二叉搜索树的最近公共祖先&#xff08;中等&#xff09;701. 二叉搜索树中的插入操作&#xff08;*中等&#xff09;4…

软件测试中如何编写单元测试用例(白盒测试)

目录 前言&#xff1a; 一、 单元测试的概念 二、开始测试前的准备 三、开始测试 四、完成测试 前言&#xff1a; 单元测试是软件测试中一种重要的测试方法&#xff0c;它是在代码级别进行测试&#xff0c;通过对每个模块或功能进行独立测试来保障代码的正确性和可靠性。…

实验篇(7.2) 11. 站对站安全隧道 - 双方互相发起连接(FortiGate-IPsec) ❀ 远程访问

【简介】前面我们实验的是FortiClient客户端与防火墙进行VPN连接&#xff0c;现在我们要做的实验是防火墙与防火墙之间进行VPN连接。现在我们来看看两台防火墙之间要怎样创建VPN连接。 实验要求与环境 OldMei集团深圳总部部署了域服务器和ERP服务器&#xff0c;用来对集团总部进…

【探索 Kubernetes|容器基础进阶篇 系列 3】容器进程的文件系统

文章目录 系列文章目录&#x1f479; 关于作者一、回顾二、容器进程的文件系统是什么样子的&#xff1f;rootfs一致性解决应用依赖关系解决复用性 三、OverlayFS 联合文件系统先决条件overlay2 驱动程序如何工作结构图探索含义-磁盘上的镜像层和容器层镜像层容器层 四、overlay…

动态规划dp —— 26.环绕字符串中唯一的子字符串

1.状态表示 是什么&#xff1f;dp表中里的值所表示的含义就是状态表示 dp[i]表示&#xff1a;以i位置元素为结尾的所有的子串里面&#xff0c;有多少个在base中出现过 2.状态转移方程 dp[i] 等于什么 如果是单个字母的子串&#xff0c;肯定会在base中出现&#xff0c;所以…

一文详解!appium自动化测试

目录 前言&#xff1a; Appinum前置知识 Andriod SDK 元素获取—UI Automator adb命令实践 adb常用命令 小结 Package与Activity Activity页面布局元素 monkey简介 monkey事件 操作事件简介 monkey参数 事件类参数 约束类参数 调试类参数 Monkey参数应用综合案…

生成式AI - 关键技术历史和发展

✈️当谈及生成式人工智能&#xff08;AI&#xff09;&#xff0c;我们进入了一个令人惊叹的领域&#xff0c;它不仅改变了我们与技术的互动方式&#xff0c;而且极大地推动了人工智能的发展。通过模仿人类创造力和想象力的能力&#xff0c;生成式AI引领着我们走向了全新的可能…

re模块

目录 ❤ 正则表达式 常用正则 字符组 字符 量词 ❤ 正则表达式的使用 . ^ $ * ? { } 字符集&#xff3b;&#xff3d;&#xff3b;^&#xff3d; 分组 ()与 或 &#xff5c;&#xff3b;^&#xff3d; 转义符 \ 贪婪匹配 ❤ re模块 常量、属性 常用方法 re.co…

echarts图表 的X轴添加滚动条

1&#xff1a;原图 2&#xff1a;代码 dataZoom [{orient: horizontal,show: scoreShow,//控制滚动条显示隐藏realtime: true, //拖动滚动条时是否动态的更新图表数据height: 5, //滚动条高度start: 0, //滚动条开始位置&#xff08;共6等份&#xff09;end: this.endValue,//…

复杂业务系统的通用架构设计法则

一、什么是复杂系统 我们经常提到复杂系统&#xff0c;那么到底什么是复杂系统。我们看下维基的定义&#xff1a;复杂系统&#xff08;英语&#xff1a;complex system&#xff09;&#xff0c;又称复合系统&#xff0c;是指由许多可能相互作用的组成成分所组成的系统。强调了…

Pytest教程__参数化(10)

pytest参数化有两种方式&#xff1a; mark的parametrize标记&#xff1a;pytest.mark.parametrize(变量名&#xff0c;变量值)&#xff0c;其中变量值类型为列表、元组或其它可迭代对象。fixture的params参数&#xff1a;pytest.fixture(params变量值)&#xff0c;其中变量值类…

Selenium元素定位方法大全

一、背景 作为当下最流行的web UI自动化测试工具&#xff0c;selenium是很多测试同学入门接触自动化测试时学习的第一个工具。想要自动化操作页面上的内容&#xff0c;元素定位是首先必须要学习的核心知识。 因此本文主要介绍selenium的几种最常用的元素定位方法&#xff0c;…

008、体系架构之SQL 执行流程

SQL 执行流程 读取的执行写入的执行DDL的执行SQL运算SQL解析和编译SQL 层架构SQL 运算分布式 SQL 运算SQL 层架构 读取的执行 元数据的读取 执行器从information_schema当总获取表的元数据信息(table meta),元数据的信息从内存中读取就可以了&#xff0c;因为已经缓存到了info…

Python抓取商品详情方法的几种方法比较

抓取商品详情的方法有很多种&#xff0c;以下是其中几种常见的方法及其优缺点&#xff1a; 1.使用requests库发送HTTP请求&#xff0c;然后解析HTML或JSON格式的数据&#xff1a; 优点&#xff1a;这种方法可以抓取几乎所有网站上的数据&#xff0c;支持GET和POST请求&#xff…

匿名内部类为什么泄漏,Lambda为什么不泄漏

作者&#xff1a;麦客奥德彪 在Android开发中&#xff0c;内存泄露发生的场景其实主要就两点&#xff0c;一是数据过大的问题&#xff0c;而是调用与被调用生命周期不一致问题&#xff0c;对于对象生命周期不一致导致的泄漏问题占90%&#xff0c;最常见的也不好分析的当属匿名内…

一段2个月工作经历没体现,美团背调没通过收回了offer

众所周知&#xff0c;很多公司在面试通过之后还会对求职者进行背景调查&#xff0c;这是企业确认求职者信息真实性的重要途径&#xff0c;具有减少信息不对称、降低用人风险等重要意义。 一般通过背景调查&#xff0c;如果企业了解到求职者劳动关系没有终止、解除、简历造假或…

抖音的外卖服务商申请详细指南!

CKA-外卖服务商对外(5、6双月) 项目背景: 通过资源牵引助力商户交易增长&#xff0c;从组品、内容、流量等方面对客户进行1v1精细化辅导&#xff0c;帮助商户进行运营动作 的优化&#xff0c;以实现双月百万交易额的showcase打造&#xff0c;并以此完成“好商&#xff0c;好品…

面了个00后的测试员,年薪20w问题基本都能回答上,必是刷了不少面试题···

互联网行业竞争是一年比一年严峻&#xff0c;作为测试工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水&#xff0c;进入心仪的企业&#xff08;阿里、字节、美团、腾讯等大厂.....&#xff09; 所以&#xff0c;大家就迎来了…

从云端进行安全日志管理

随着企业变得越来越动态&#xff0c;需要一个灵活且易于访问的日志管理解决方案。Log360 Cloud 从本地和基于云的数据中收集您的网络日志&#xff0c;将其存储在云中&#xff0c;并通过多个实时/自动更新的图形仪表板实时提供网络安全的全面视图。 为什么选择云日志记录 随时…

数据中心交换机和园区交换机有啥区别?

概要 在网络架构中&#xff0c;交换机是一种重要的设备&#xff0c;用于连接计算机、服务器和其他网络设备。随着不同领域的需求&#xff0c;交换机也有多种类型。本文将详细介绍数据中心交换机和园区交换机之间的区别&#xff0c;包括它们的原理和使用场景。 一. 数据中心交换…