力扣题解(设计跳表)

1206.设计跳表

已解答

不使用任何库函数,设计一个 跳表 。

跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。

例如,一个跳表包含 [30, 40, 50, 60, 70, 90] ,然后增加 8045 到跳表中,以下图的方式操作:

跳表中有很多层,每一层是一个短的链表。在第一层的作用下,增加、删除和搜索操作的时间复杂度不超过 O(n)。跳表的每一个操作的平均时间复杂度是 O(log(n)),空间复杂度是 O(n)

了解更多 : 跳表 - OI Wiki

在本题中,你的设计应该要包含这些函数:

  • bool search(int target) : 返回target是否存在于跳表中。
  • void add(int num): 插入一个元素到跳表。
  • bool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回false. 如果存在多个 num ,删除其中任意一个即可。

注意,跳表中可能存在多个相同的值,你的代码需要处理这种情况。

本题主要难点在于理解调表的构造和查找元素的做法。首先,调表的优势在于可以一下子跳过很多元素,所以叫跳表,而能一下跳过很多元素的原因是跳表中存在多层的元素,如果高层可以通过,则高层之间的底层可以忽略,实现了跳过多个元素。

越往上层数越高。

此时从-3所在节点开始走,若比10大,则可以跳过和低层的2,6比较,实现了跳跃。

跳表实现最复杂的地方是找数值是num的节点对应的所有前一个节点(即每层的前一个节点),实现方法是从最高层开始查找,当节点的值大于num或者节点是不存在时,则本层的前一个前一个节点找到,在去低一层找,之所以可以去低一层找,是因为低一层中存放的节点值一定是在高一层的节点的值中间,而与num的大小不能确定,因此需要去进一步查找。

	vector<node*>findprevnode(int num){int level = _root->_next.size();vector<node*>pre(level);level--;node* cur = _root;while (level >= 0){if (cur->_next[level] && cur->_next[level]->_val < num){cur = cur->_next[level];}else if (cur->_next[level] == nullptr || cur->_next[level]->_val >= num){pre[level--] = cur;}}return  pre;}

对于插入和删除,搜索,都是复用了这个函数,找到对应前一个节点位置,然后进行插入,删除操作即可。对于搜索,只需要从返回的数组的下标为0的节点判断即可,因为该节点所指的下一个节点一定是数组所有节点所指的下一个节点的最小值,如果这个节点存放的值都不对,则必定找不到所需的节点。

class Skiplist {
public:struct skiplistnode{int _val;vector<skiplistnode*>_next;skiplistnode():_val(-1){}skiplistnode(int num, int n){_val = num;_next.resize(n, nullptr);}};typedef skiplistnode node;node* _root;Skiplist() {srand((unsigned)time(nullptr));_root = new node();}vector<node*>findprevnode(int num){int level = _root->_next.size();vector<node*>pre(level);level--;node* cur = _root;while (level >= 0){if (cur->_next[level] && cur->_next[level]->_val < num){cur = cur->_next[level];}else if (cur->_next[level] == nullptr || cur->_next[level]->_val >= num){pre[level--] = cur;}}return  pre;}bool search(int target) {vector<node*>prevnode = findprevnode(target);if (prevnode[0]->_next[0] == nullptr || prevnode[0]->_next[0]->_val != target){return false;}else{return true;}}int creatrand(){int level = 1;double p = 0.5;int it = rand();int itt = RAND_MAX * p;//	cout << it << " " << itt << endl;while (level <= 32 && rand() < RAND_MAX * p){   level++;}return level;}void add(int num) {vector<node*>prevnode = findprevnode(num);int n = creatrand();if (n > _root->_next.size()){_root->_next.resize(n);prevnode.resize(n,_root);}node* cur = new node(num, n);for (int i = 0; i < n; i++){cur->_next[i] = prevnode[i]->_next[i];prevnode[i]->_next[i] = cur;}}bool erase(int num) {vector<node*>prevnode = findprevnode(num);if (prevnode[0]->_next[0] == nullptr || prevnode[0]->_next[0]->_val != num){return false;}else{node* cur = prevnode[0]->_next[0];for (int i = 0; i < cur->_next.size(); i++){prevnode[i]->_next[i] = cur->_next[i];}delete cur;return true;}}
};

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

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

相关文章

【观成科技】Websocket协议代理隧道加密流量分析与检测

Websocket协议代理隧道加密流量简介 攻防场景下&#xff0c;Websocket协议常被用于代理隧道的搭建&#xff0c;攻击者企图通过Websocket协议来绕过网络限制&#xff0c;搭建一个低延迟、双向实时数据传输的隧道。当前&#xff0c;主流的支持Websocket通信代理的工具有&#xf…

构建高精度室内定位导航系统,从3DGIS到AI路径规划的全面解析

室内定位导航系统是一种利用多种技术实现室内精准定位和导航的智能系统&#xff0c;即便没有卫星信号&#xff0c;也能实现精准导航。维小帮室内定位导航系统是基于自研的地图引擎与先进定位技术&#xff0c;结合智能路径规划算法&#xff0c;解决了人们在大型复杂室内场所最后…

【深度学习】图形模型基础(6):模型优化理论

1.引言 在之前的讨论中&#xff0c;我们构建了一个理论模型来表达最优决策规则&#xff0c;这是建立在我们对数据的概率模型有充分理解的基础上的。相对地&#xff0c;经验风险最小化&#xff08;Empirical Risk Minimization, ERM&#xff09;策略则在缺乏精确概率模型的情况…

Python编程学习第一篇——Python零基础快速入门(六)

今天大家一起来学习一下Python 中的运算符&#xff0c;主要分为以下几类&#xff1a;算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、身份运算符和成员运算符。 算术运算符&#xff1a; &#xff1a;加法运算符&#xff0c;用于两个数相加。-&#xff1a;减法运算…

Java语言程序设计——篇三(1)

选择结构 概述选择单分支if语句例题讲解 双分支if-else语句例题讲解 条件运算符多分支的if-else语句例题讲解 嵌套的if语句例题讲解 switch语句结构例题讲解代码演示运行结果 概述 Java中的控制结构&#xff0c;包括&#xff1a; 1、选择结构( if、if-else、switch ) 2、循环结…

仕考网:非应届生可以参加公务员考试吗?

往届生有资格参加国家公务员考试。根据《公务员录用规定》&#xff0c;只要满足一系列资格条件&#xff0c;就符合报考资格。 1、年龄在18到35岁之间。 2、具备良好的品德&#xff0c;身体健康且心理素质稳定&#xff0c;拥有拟任职位所需的工作能力。 3、至少为大学专科以上…

前端计算网络常识

OSI七层模型 OSI ( Open System Interconnection )是理想化的模型&#xff0c;将网络进行分层&#xff0c;其目的是将 复杂的流程简单化&#xff0c;从而实现分而治之。&#xff08;专人干专事&#xff09; 一.网络分层的含义? 下层是为了上层提供服务的。 应用层&#xff1a;…

【排序 - 归并排序】

归并排序&#xff08;Merge Sort&#xff09;是一种高效的排序算法&#xff0c;基于分治&#xff08;Divide and Conquer&#xff09;策略。它将待排序数组分成两个较小的子数组&#xff0c;分别对它们进行排序&#xff0c;然后将排好序的子数组合并成一个整体有序的数组。归并…

qt connect 链接其他类的函数

在 Qt 中&#xff0c;connect 函数用于建立信号与槽的连接&#xff0c;使得当某个信号被触发时&#xff0c;与之连接的槽函数将被调用。如果你想连接其他类的函数&#xff0c;你需要确保满足以下条件&#xff1a; 信号与槽的匹配&#xff1a;信号和槽的参数类型和数量必须匹配…

愚人杯的RE题

easy_pyc pyc反编译成py文件 # uncompyle6 version 3.9.1 # Python bytecode version base 2.7 (62211) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: enpyc.py # Compiled at: 2023…

html5——列表、表格

目录 列表 无序列表 有序列表 自定义列表 表格 基本结构 示例 表格的跨列 表格的跨行 列表 无序列表 <ul>【声明无序列表】 <li>河间驴肉火烧</li>【声明列表项】 <li>唐山棋子烧饼</li> <li>邯郸豆沫</li> <l…

opencv实现目标检测功能----20240704

早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。这次我们使用Opencv深度学习的功能实现目标检测的功能,模型选用MobileNetSSD_deploy.caffemodel。 模型加载…

Aop实现后端数据重复提交

一、思路 用户每次发送请求都有一个标记&#xff0c;这个标记设置成5s有效存到redis中。每次请求检查该标记是否有效&#xff0c;还有效就说明请求太频繁了。无效就说明请求之间时间间隔够了&#xff0c;可以继续请求了。 gitee地址&#xff1a;添加链接描述 二、实现 自定义…

机器学习与深度学习:区别与联系(含工作站硬件推荐)

一、机器学习与深度学习区别 机器学习&#xff08;ML&#xff1a;Machine Learning&#xff09;与深度学习&#xff08;DL&#xff1a;Deep Learning&#xff09;是人工智能&#xff08;AI&#xff09;领域内两个重要但不同的技术。它们在定义、数据依赖性以及硬件依赖性等方面…

空中交通新动能!2024深圳eVTOL展动力电池展区核心内容抢先看!

空中交通新动能&#xff01;2024深圳eVTOL展动力电池展区核心内容抢先看&#xff01; 关键词&#xff1a;2024深圳eVTOL展 动力电池 高能量密度电池 高性能电池材料 作为2024深圳eVTOL展重要组成部分&#xff0c;2024深圳eVTOL动力电池展将于9月23-25日在深圳坪山燕子湖国际会…

二刷算法训练营Day57 | 动态规划(17/17)

目录 详细布置&#xff1a; 1. 516. 最长回文子序列 2. 动态规划总结 详细布置&#xff1a; 1. 516. 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#x…

基于JAVA+SpringBoot+Vue的社区普法平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 社区普法平台旨在为社…

js函数表达式,一个重要的概念

最外面的括号在JavaScript中的IIFE&#xff08;Immediately Invoked Function Expression&#xff0c;立即调用函数表达式&#xff09;中起着重要的作用。让我们详细解释一下。 IIFE&#xff08;立即调用函数表达式&#xff09; IIFE 是一种常见的JavaScript设计模式&#xf…

Sqlmap中文使用手册 - Options模块参数使用

目录 1. Options模块的帮助文档2. 各个参数的介绍2.1 -h --help2.2 -hh2.3 --version2.4 -v VERBOSE 1. Options模块的帮助文档 Options:-h, --help Show basic help message and exit-hh Show advanced help message and exit--version …

Python程序封装成Windows服务实践

1. WinSW 工具概述 WinSW&#xff08;Windows Service Wrapper&#xff09;是一个轻量级的、开源的工具&#xff0c;用于将任何可执行文件&#xff08;包括exe、jar、脚本文件等&#xff09;包装成一个Windows服务。这意味着&#xff0c;原本设计为命令行应用或需要手动启动的…