华为2023暑期笔试(2-2)——最近最少使用(LRU, Least recently used)缓存算法

news2025/1/19 22:07:04

目录

  • 题目内容
  • 解答要求(解答要求限制了只能使用LRU)
  • 输入描述
  • 样例
  • 思路
  • 代码

题目内容

  你是一名网络工程师,你正在为一家云计算公司开发一个虚拟机管理系统。你的系统需要为每个虚拟机分配一个唯一的ID,用来标识和通信。为了实现这个功能,你设计了一个管理ID的资源池,可以从资源池中分配资源ID和释放资源ID,分配方式有动态分配和指定分配。
  动态分配是从资源池的开始分配多个资源ID,这种方式适用于新创建的虚拟机。指定分配是指定一个资源ID进行分配,这种方式适用于恢复或迁移的虚拟机。无论哪种分配方式释放资源ID时都需要放到资源池的尾部,这样可以保证资源ID的重用和均衡。
  现在,你已经执行了一系列操作,你需要知道资源池的第一个空闲资源ID应该是多少,以便为下一个虚拟机分配。

注意:
  资源池的初始顺序是从小到大。
  资源池中空闲资源ID不足时,动态分配失败,对资源池不进行任何操作。指定分配资源ID已经被占用或者不在资源池范围内时,对资源池不进行任何操作。
  释放资源ID不在资源池范围内时或者已经是空闲资源ID时,对资源池不进行任何操作。
  保证每个用例最后都有空闲资源ID。

解答要求(解答要求限制了只能使用LRU)

时间限制: C/C++ 100ms,其他语言: 200ms
内存限制: C/C++ 32MB,其他语言: 64MB

输入描述

第一行是资源池的范围。
第二行是操作个数。
第三行开始,第一个数字代表操作类型,1表示动态分配,2表示指定分配,3表示释放。
如果第一个数字是1,第二个表示分配的个数;
如果第一个数字是2,第二个表示分配的资源ID;
如果第一个数字是3,第二个表示释放的资源ID.

样例

在这里插入图片描述

思路

性能限制很高、数据量很大时,cin、cout肯定是不够快的。
(1)可以利用getchar()速度快的特性设计快读函数读取整数,可以做到用scanf()函数5倍的速度读入任意整数:

#include<cstdio>
// 仅正整数可用
#define read(a) {char c;while((c=getchar())>47) a=a*10+(c^48);}
// 正负整数均可用
inline void read(int& a)
{
	register int s = 0, w = 1; //register意思是将变量放入寄存器,大幅提升效率
	register char ch = getchar();
	while (ch < '0' || ch>'9')
	{//为了避免输入数字之前的空格造成影响以及判断正负
		if (ch == '-') { w = -1; }
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		s = s * 10 + ch - '0';
		ch = getchar();
	}
	a = s * w;
}

(2)快写,注意<cstdio>中printf()也比cout快,如果输出不是int类型,可以用printf(“<式样化字符串>”,<参数表>);

输出string:printf( "%s", s );
输出指定宽度的string:printf(”%.3s“, hello);或者 printf("message: '%.*s'\n", 3, hello);
输出bool类型变量:bool b=true; if(b) printf("true"); else printf("false");

#include<cstdio>
inline void write(int n)
{
	if (n < 0)
	{
		putchar('-');
		n *= -1;
	}
	if (n > 9)
	{
		write(n / 10);
	}
	putchar(n % 10 + '0');
}

(3)快速存取:使用满足 LRU (最近最少使用) 缓存 约束的数据结构

思路:使用一个双指针链表和一个哈希表,所有增删查改复杂度为O(1)

  1. 双链表表示资源池,存储一个节点被操作(可以是被资源分配,也可以是被释放)的时间戳,且按最近使用时间从左到右排好序,左边的是空闲资源池,右边的是;

  2. 哈希表存储key对应的链表中的节点地址(资源id号), 用于key-value 的增删改查;int类型value值表示此时结点是否处于被占用状态。1表示被占用,0表示空闲。

  3. 初始化:双链表资源池和哈希表key根据资源池范围初始化,value全部设定为空闲状态0;

  4. 操作:分配的本质是从资源池中删除,释放的本质是添加到资源池的末尾

    1. 动态分配k个资源:
      • 用哈希表遍历前k个node对应的value,依次置1;
      • 将key对应的节点删除;
    2. 指定分配第k个资源
      • 用哈希表查找key=k的node对应value,将其置1;
      • 将key对应的节点删除;
    3. 释放第k个资源:
      • 首先用哈希表判断key对应的结点是否被占用(value是否为1);
      • 如果为1,则value置为0表示空闲,同时将key对应的节点放到双链表的最左侧;

    1、2需要先判断key对应的value是否为0,然后才能进行操作。

  5. 输出:资源池的第一个空闲资源id即链表的第一个结点的key。注意这题保证每个用例最后都有空闲资源ID。

代码

待更新

该题型还包括LC146 LRU缓存,其变种题型为LC469 LFU缓存

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

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

相关文章

C++基础demo(C++入门基础案例)

C入门基础案例学习与了解 demo16 计算年份是否为闰年&#xff08;各种运算符结合&#xff09;demo17 打印ASCII码表demo18 求完数demo19 密码验证&#xff08;if……else&#xff09;demo20 图书管理&#xff08;if…else if…else&#xff09;demo21 信号灯&#xff08;和--&a…

python中使用ctypes库调用使用MMDeploy C++ SDK编译得到的dll文件时,出现WinError126的解决方法

之前&#xff0c;通过以下两篇文章&#xff0c;着重介绍了&#xff0c;使用openMMLab开发的MMDeploy库对MMxx系列仓库训练得到的权重pth转换得到的onnx&#xff0c;并分别使用python SDK和C SDK进行调用的详细步骤&#xff1a; 使用MMDeploy&#xff08;预编译包&#xff09;转…

Enterprise:如何在 Elastic 企业搜索引擎中添加对更多语言的支持

作者&#xff1a;Ioana-Alina Tagirta Elastic App Search 中的引擎&#xff08;engines&#xff09;使你能够索引文档并提供开箱即用的可调搜索功能。 默认情况下&#xff0c;引擎支持预定义的语言列表。 如果你的语言不在该列表中&#xff0c;此博客将说明如何添加对其他语言…

RabbitMQ笔记

一、MQ与RabbitMQ概述 1. MQ简述 MQ&#xff08;Message Queue&#xff09;消息队列&#xff0c;是基础数据结构中 “先进先出” 的一种数据结构&#xff0c;也是在消息的传输过程中保存消息的容器&#xff08;中间件&#xff09;&#xff0c;多用于分布式系统之间进行通信。 …

[Pandas] 设置DataFrame的index索引起始值为1

导入数据 import pandas as pddf pd.DataFrame([[liver,E,89,21,24,64],[Arry,C,36,37,37,57],[Ack,A,57,60,18,84],[Eorge,C,93,96,71,78],[Oah,D,65,49,61,86]], columns [name,team,Q1,Q2,Q3,Q4]) df 上述DataFrame中的index索引列默认是从0开始的&#xff0c;那么我们…

【Spark】Spark是什么?能干什么?有什么特点?

一、什么是Spark 官网&#xff1a;http://spark.apache.org Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters. Spark是一种快速、通用、可扩展的大数据分析引擎&#xf…

MATLAB连续LTI系统的时域分析(十)

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握利用MATLAB对系统进行时域分析的方法&#xff1b; 2&#xff09;掌握连续时间系统零输入响应的求解方法&#xff1b; 3&#xff09;掌握连续时间系统零状态响应、冲激响应和…

AD9739配置解析与数据输出指南

1 概述 本文用于AD9737芯片的配置使用情况&#xff0c;以及数据输出的格式说明情况&#xff0c;数据速率的计算情况等。 AD9739是ADI公司的一款14BIT&#xff0c;可达2.5GSPS采样率的DAC芯片。 2 AD9739的性能 支持的输入数据速率&#xff1a;1.6GSPS TO 2.5GSPS. industry lea…

基于3D渲染和基于虚拟/增强现实的IIoT原理的数字孪生平台的方案论文阅读笔记

基于3D渲染和基于虚拟/增强现实的IIoT原理的数字孪生平台的方案论文阅读笔记 论文原文链接&#xff1a;https://ieeexplore.ieee.org/abstract/document/9039804 本笔记对部分要点进行了翻译和批注&#xff0c;原文和翻译可参考链接阅读&#xff0c;此处不进行完整翻译。 论文…

【服务网格】Service Mesh 是什么?为我们解决了什么问题?

文章目录 背景一、Service Mesh 介绍Service Mesh的定义Service Mesh 诞生 二、Service Mesh 解决的问题三、Service Mesh 的原理四、Service Mesh具体是怎么实现的&#xff1f;Istio是什么&#xff1f;istio架构和主要功能Istio 1.5.1 性能总结Istio与Kubernetesistio的实战案…

四、MyBatis获取参数值的两种方式(重点)

文章目录 四、MyBatis获取参数值的两种方式&#xff08;重点&#xff09;4.1 单个字面量类型的参数4.2 多个字面量类型的参数4.3 map集合类型的参数4.4 实体类类型的参数4.5 使用Param标识参数 四、MyBatis获取参数值的两种方式&#xff08;重点&#xff09; MyBatis获取参数值…

IP-GUARD屏幕记录能实现平时不记录,特定操作触发记录吗?

支持触发性屏幕记录。部分策略有选项“记录屏幕”,勾选后,策略触发时,会自动记录客户端当时的屏幕情况,记录次数和间隔可通过配置修改。 所有包含了记录屏幕的策略有: 应用程序、上网浏览、流量控制、网络控制、邮件控制、IM传送控制、上传控制、文档控制、打印控制、敏感…

深浅拷贝,类型检测及继承面试题

01 对象的深/浅拷贝 1.1 变量的存储 基本类型&#xff1a;基本类型的值存在栈内存中 引用类型&#xff1a; 引用类型的地址存储在栈内存中&#xff0c;他的值存储在堆内存中&#xff0c;通过指针(地址)连接 1.2 变量拷贝 基本类型&#xff1a;基本类型拷贝的是值 引用类型…

达梦数据库中,如何设置表的访问控制权限?

在工作中&#xff0c;大家都会遇到这样的场景&#xff0c;出于对数据库访问安全的考虑&#xff0c;对于某些用户我们不想让他们看到全库的表&#xff0c;只想给他们特定表的访问权限。那么在DM数据库中我们该如何去配置相应的权限呢&#xff1f; 我们下面来进行详细解析。 我们…

buuctf6

目录 [ACTF2020 新生赛]BackupFile [RoarCTF 2019]Easy Calc 利用PHP的字符串解析特性Bypass: http走私攻击 来首歌吧 荷兰宽带数据泄露​编辑 面具下的flag [ACTF2020 新生赛]BackupFile 1.打开环境 查看源代码得不到任何想要的信息&#xff0c;使用目录扫描来得到我们…

关于秒杀系统的一系列问题

阻塞队列怎么么实现&#xff1f;超卖问题&#xff1f;整体怎么实现&#xff1f; 5 设计一个秒杀系统 特点&#xff1a;高并发&#xff0c;请求量远大于库存量&#xff0c;只有少数能成功&#xff1b;逻辑比较简单&#xff0c;下单减库存&#xff1b; 设计理念&#xff1a;**限…

ESP8266基于Lua开发点灯示例

ESP8266基于Lua开发点灯示例 ✨基于ESPlorer IDE&#xff1a;https://github.com/4refr0nt/ESPlorer/releases&#x1f527;固件烧录工具&#xff1a;NodeMCU-PyFlasher&#x1f33f;esp8266烧录工具下载&#xff1a;https://github.com/marcelstoer/nodemcu-pyflasher/release…

LabVIEW CompactRIO 开发指南2 CompactRIO软件架构

第一章 CompactRIO软件架构 几乎所有的CompactRIO系统都至少有三个顶层VIs在三个不同的目标上异步执行:FPGA、实时操作系统(RTOS)和主机PC。如果开始软件开发时没有某种架构或流程图可供参考&#xff0c;那么可能会发现跟踪所有软件组件和通信路径是具有挑战性的。拥有一个在…

CentOS7上使用yum搭建LNMP架构并实现wordpress博客实战

前言 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;阿里云社区博客专家&#x1f609;&#x1f609; &#x1f495; 座右铭&#xff1a; 先努力成长自己&#xff0c;再帮助更多的人 &#xff0c…

魔兽worldserver.conf 服务端配置文件说明

魔兽worldserver.conf 服务端配置文件说明 我是艾西&#xff0c;今天把很多小伙伴需要的魔兽worldserver.conf 服务端配置文件说明分享给大家&#xff0c;大家可以自己研究参考下 worldserver.conf 这个文件是服务端的配置文件&#xff0c;可以在这里做很多个性化修改 注意&a…