力扣题解(设计跳表)

news2024/9/22 9:39:09

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.coloradmin.cn/o/1916005.html

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

相关文章

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

汉初三杰韩信,是不是颍川人

再重复一次&#xff0c;此韩信非彼韩信&#xff0c;说的是汉初三杰淮阴侯韩信&#xff0c;不是韩王信。 他俩的共同之处还真多&#xff0c;同名同姓&#xff0c;都被封王&#xff0c;八大异姓王韩姓占了两位。而且&#xff0c;结局也一样&#xff0c;都因反判罪被朝廷处死。这…

图书馆、档案馆、博物馆之智能建筑设计要求比较

关注我们 - 数字罗塞塔计划 - 随着科技的不断进步以及人们对建筑功能需求的日益提升&#xff0c;智能化技术在建筑领域的应用越来越广泛。将建筑物的结构、系统、服务和管理根据用户的需求进行最优化组合&#xff0c;进而为用户提供一个高效、舒适、便利的人性化建筑环境&…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 &#xff08;1&#xff09;准备Arcmap桌面软件&#xff1b; &#xff08;2&#xff09;准备2020年逐月平均气温数据&#xff08;NC格式&#xff09;、范围图层数据&…

[论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天带来又一篇RAG论文笔记&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 检索增强语言模型能够更好地适应世界状态的变化并融入长尾知识。然而&#xff0c;大多数现有方法只能从检索语料库中检索到短的连续文本片段&#xff0…

再见微软Excel, AI Excel带你轻松搞定复杂数据分析

大家好&#xff0c;我是YUAN哥。在数据处理的世界里&#xff0c;Microsoft Excel一直是我们的好帮手。不过&#xff0c;现在有一种更聪明、更简便的方式来管理和分析数据——那就是将AI引入电子表格。今天&#xff0c;我要向大家介绍一个神奇的新工具——Numerous.ai。 首先&am…

SepViT: Separable(分离式) Vision Transformer

Vision Transformers(ViT)在一系列的视觉任务中取得了显著的成功。然而,这些Transformer模型通常依赖大量的计算成本来实现高性能,这使得在资源受限的设备上部署它们变得非常困难。研究者们从深度可分离卷积(depthwise separable convolution)中汲取经验,并模仿其设计理…

【Python专栏】Python的历史及背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Python专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Python的背景介绍 关键词&#xff1a;Python、优缺点、领域 目录 …

先进电机拓扑及控制算法介绍(1)——串联绕组电机拓扑极其控制

1.前言 在这个专栏&#xff0c;我会介绍一些比较先进的电机拓扑及控制算法&#xff0c;并且会做仿真来验证这些电机拓扑及控制算法的先进性。什么叫做“比较先进的电机拓扑及控制算法”呢&#xff1f; 在我看来&#xff0c;这些电机拓扑及控制算法被提出不久&#xff0c;知道…

无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。【解决办法】

问题描述 新建好一台windows虚拟机&#xff0c;两台设备网络是互通的&#xff0c;但是物理机在访问虚拟机的网络共享文件资源时&#xff0c;出现图下所示的报错&#xff1a;XXX无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。用户…

初次用bable遍历vue项目下的中文

利用 babel 找到 AST 中的中文 // vite-plugin-babel-transform.js const parser require(babel/parser) const traverse require(babel/traverse).default // const types require(babel/types) // const generate require(babel/generator).default const fs require(f…

场外期权有交割日吗?场外期权应该怎么交割?

今天带你了解场外期权有交割日吗&#xff1f;场外期权应该怎么交割&#xff1f;场外个股期权是一种非标准化的金融衍生品&#xff0c;它允许投资者在未来某一特定日期以特定价格买入或卖出某一特定股票。 交割日就是买卖双方进行交割的日期,期权合约具有到期日,到期日的后一天…

开放式耳机哪种好用又实用?五大热门畅销空气炸锅推荐2024

开放式耳机市场现在越来越多品牌涌现了&#xff0c;作为数码博主&#xff0c;这里有必要给大家科普一下如何选择一款开放式欸日记是最好的&#xff0c;这篇文章就是给大家答疑解惑的&#xff0c;想要知道如何挑选一款开放式耳机的&#xff0c;看这一篇就够了&#xff0c;在介绍…

视频监控汇聚平台LntonCVS视频监控系统解决智慧产业园的安全应用方案

近年来&#xff0c;随着全国各地数字化转型和相关政策的出台&#xff0c;数字化和智慧化在各行业迅速发展&#xff0c;尤其是作为产业集群重要组成部分的产业园区。然而&#xff0c;园区智慧化进程加快的同时&#xff0c;数字化转型面临着诸如视频监控数据分散、联通不畅、碎片…

开源无人机从入门到炸机,共需要几步?

阿木实验室2024年的重磅新品 Prometheus 仿真笔记本已经上架有一段时间了&#xff0c;近日&#xff0c;该产品的研发负责人廖工受邀到直播间与开发者们深度解读了Prometheus仿真笔记本的设计理念。直播过程中&#xff0c;廖工不仅展示了该产品的功能demo&#xff0c;解答技术开…

ARM功耗管理标准接口之ACPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…

<PLC><威纶通>威纶通触摸与信捷PLC通讯,使用脚本根据页面自动切换模式

前言 本系列是关于PLC相关的博文&#xff0c;包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌&#xff0c;汇川、信捷等国内品牌。 除了PLC为主要内容外&#xff0c;PLC相关元器件如触摸屏…

数字人+展厅互动体验方案:多元化互动方式,拓宽文化文娱新体验

数字化创新已成为推动展厅可持续发展&#xff0c;创造全新消费体验&#xff0c;满足游客多元化需求的关键力量。 “数字人数字互动展厅”可以适应年轻一代的文化传播与多媒体互动新体验趋势&#xff0c;打造新生代潮玩聚集地&#xff0c;促进文化创意传播与互动体验场景创新&a…

JMH325【剑侠情缘3】第2版80级橙武网游单机更稳定亲测视频安装教学更新整合收集各类修改教学补丁兴趣可以慢慢探索

资源介绍&#xff1a; 是否需要虚拟机&#xff1a;是 文件大小&#xff1a;压缩包约14G 支持系统&#xff1a;win10、win11 硬件需求&#xff1a;运行内存8G 4核及以上CPU独立显卡 下载方式&#xff1a;百度网盘 任务修复&#xff1a; 1&#xff0c;掌门任务&#xff08…