链表-LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRU是Least Recently Used的缩写,意为“最近最少使用”。LRU是一种常用的缓存淘汰策略,用于管理缓存中的数据。

举个例子,你从一堆书中找出自己想要看的书,读完之后一般是放在最上面;如果你又从其他地方拿了一本书读完之后,打算放入这堆书中,如果这堆书中还有同名书,只是年份不同,那么就用这本书进行替换,如果没有同名书,由于“空间”不够使用,只能将最底下的书移走,再放入这本书

LRU缓存算法的基本思想是:当缓存空间不足时,优先淘汰最近最少使用的数据,以便为新数据腾出空间。具体来说,LRU算法会维护一个有序列表,列表中的元素按照访问时间从新到旧排列。每当缓存命中时,就将命中的数据移动到列表的头部,每当缓存缺失时,就将新数据插入到列表的头部,并将列表尾部的数据淘汰掉。

LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。

如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

由于题目要求O(1)复杂度,采取双链表,每个节点都是一本书;使用哈希来快速查找书籍

先创建节点Node

struct Node{int _key;int _value;Node* _next;Node* _prev;Node(int key, int value): _key(key), _value(value), _next(nullptr), _prev(nullptr){}
};

刚开始时,使用一个哨兵节点

class LRUCache {
private:Node* _dummy;int _capacity;unordered_map<int, Node*> _map;public:LRUCache(): _dummy(new Node(-1, -1)), _capacity(0){_dummy->_next = _dummy;_dummy->_prev = _dummy;}
};

实现查找书

    Node* get_node(int key)//查找书{auto it=_map.find(key);if(it==_map.end())//没找到return nullptr;auto node=it->second;//找到了remove(node);//从书堆中取出insert_to_head(node);//放在书顶return node;}

实现将书从书堆中移除

    void remove(Node* node)//从书堆中移除{node->_prev->_next = node->_next;node->_next->_prev = node->_prev;}

实现将书放入书顶

    void insert_to_head(Node* node)//放入书顶{node->_next = _dummy->_next;node->_prev = _dummy;_dummy->_next->_prev = node;_dummy->_next = node;}

实现取书get功能

    int get(int key){auto node=get_node(key);//查找这本书return node?node->_value:-1;}

实现放入put功能

    void put(int key, int value){auto node = get_node(key);if(node)//书堆中已经存在,进行替换{node->_value=value;return;}_map[key]=node=new Node(key, value);insert_to_head(node);//独一份,放入书顶if(_map.size()>_capacity){auto node=_dummy->_prev;remove(node);_map.erase(node->_key);delete node;}}

完整代码

struct Node{int _key;int _value;Node* _next;Node* _prev;Node(int key, int value): _key(key), _value(value), _next(nullptr), _prev(nullptr){}
};class LRUCache {
private:Node* _dummy;int _capacity;unordered_map<int, Node*> _map;void remove(Node* node)//从书堆中移除{node->_prev->_next = node->_next;node->_next->_prev = node->_prev;}void insert_to_head(Node* node)//放入书顶{node->_next = _dummy->_next;node->_prev = _dummy;_dummy->_next->_prev = node;_dummy->_next = node;}Node* get_node(int key)//查找书{auto it=_map.find(key);if(it==_map.end())//没找到return nullptr;auto node=it->second;//找到了remove(node);//从书堆中取出insert_to_head(node);//放在书顶return node;}public:LRUCache(): _dummy(new Node(-1, -1)), _capacity(0){_dummy->_next = _dummy;_dummy->_prev = _dummy;}int get(int key){auto node=get_node(key);//查找这本书return node?node->_value:-1;}void put(int key, int value){auto node = get_node(key);if(node)//书堆中已经存在,进行替换{node->_value=value;return;}_map[key]=node=new Node(key, value);insert_to_head(node);//独一份,放入书顶if(_map.size()>_capacity){auto node=_dummy->_prev;remove(node);_map.erase(node->_key);delete node;}}
};

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

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

相关文章

JavaScript云LIS系统概述 前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;中&#xff0c;用于连…

《异常检测——从经典算法到深度学习》27 可执行且可解释的在线服务系统中重复故障定位方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

Oracle 监控 SQL 精选 (一)

Oracle数据库的监控通常涉及性能、空间、会话、对象、备份、安全等多个层面。 有效的监控可以帮助 DBA 及时发现和解决问题&#xff0c;提高数据库的稳定性和性能&#xff0c;保障企业的数据安全和业务连续性。 常用的监控指标有&#xff1a; 性能指标&#xff1a; 查询响应时间…

实验二: 密码恢复

1.实验环境 用路由器和交换机搭建实验环境 2.需求描述 实现管理员主机对交换机和路由器的远程管理 设备上配置的密码都要被加密 3.推荐步骤 对于路由器的步骤如下&#xff1a; 重启路器&#xff0c;并按下 CtrlBreak 组合键中断0S 的加载&#xff0c;路由器将进入ROM Mon…

AUTOSAR OS Alarm讲解

Alarm定义 使用中断ISR可以构建以不同速率激活任务的系统。然而,对于复杂的系统,这种方式效率不高且不切实际。alarm(警报)提供了一种更方便、更灵活的调度系统的方式。 alarm由两部分组成: 一个计数器一个或多个与计数器关联的alarmalarm指定当达到特定的计数器值时要执…

千行 MySQL 学习笔记总结大全,语法大全

Windows服务 -- 启动MySQLnet start mysql -- 创建Windows服务sc create mysql binPath mysqld_bin_path(注意&#xff1a;等号与值之间有空格) 连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示…

抽象工厂模式(Redis 集群升级)

目录 定义 Redis 集群升级 模拟单机服务 RedisUtils 模拟集群 EGM 模拟集群 IIR 定义使⽤接⼝ 实现调⽤代码 代码实现 定义适配接⼝ 实现集群使⽤服务 EGMCacheAdapter IIRCacheAdapter 定义抽象⼯程代理类和实现 JDKProxy JDKInvocationHandler 测试验证 定义 …

Mockaroo - 在线生成测试用例利器

简介&#xff1a;Mockaroo 是一个无需安装的在线工具&#xff0c;用于生成大量的自定义测试数据。它支持多种数据格式&#xff0c;如JSON、CSV、SQL和Excel&#xff0c;并能模拟复杂的数据结构。 历史攻略&#xff1a; 测试用例&#xff1a;多条件下编写&#xff0c;懒人妙用…

ChatGPT付费创作系统V2.8.4独立版 WEB+H5+小程序端 (新增Pika视频+短信宝+DALL-E-3+Midjourney接口)

小狐狸GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;无限多…

网盘——文件重命名

文件重命名具体步骤如下&#xff1a; 目录 1、具体步骤 2、代码实现 2.1、添加重命名文件的槽函数 2.2、关联重命名文件夹信号槽 2.3、添加重命名文件的协议 2.4、添加槽函数定义 2.5、服务器 2.6、添加重命名文件的case 2.7、客户端接收回复 3、测试 3.1、点击重命…

debian配置四叶草输入法

效果展示 一、前言 在linux下体验比较好的输入法只有两款&#xff1a;搜狗输入法、四叶草输入法。 ubuntu下可以成功配置搜狗输入法&#xff0c;但debian下从来没有成功过。 今天在用fcitx5 四叶草时发现VNC远程输入法会失灵&#xff0c;于是改用了ibus 四叶草&#xff0c…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器&#xff0c;在item中添加了很多的控件&#xff0c;这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候&#xff0c;及容易不小心就把数据给修改了而不自知。所有&#xff0c;我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

原生微信小程序中案例--仿boss区域树选择列多选功能

1. 需求描述&#xff1a; 区域三级列表&#xff0c; 有添加&#xff0c;编辑&#xff0c;删除功能。 选择父级分类&#xff0c;其下子类全部选中&#xff0c;当前分类后加标志显示全字样取消选中子类&#xff0c;其父类分类后标志显示选中数量若子类全部选中&#xff0c;除当…

对2023年图灵奖揭晓看法

2023年图灵奖揭晓&#xff0c;你怎么看&#xff1f; 2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。这些贡献不仅推…

【stomp 实战】spring websocket源码分析之握手请求的处理

上一节【搭建一套websocket推送平台】我们通过一个项目&#xff0c;实现了一套推送平台。由于spring框架对于websocket的支持和stomp协议的良好封装&#xff0c;我们很容易地就实现了websocket的消息推送功能。虽然搭建这么一套推送系统不难&#xff0c;但是如果不了解其底层原…

Spring Cloud Alibaba Sentinel 使用

初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址&#xff1a; home | Sentinel 需要了解的概念 簇点链路 在学习 Sentinel 的使用之前&#xff0c;我们有必要首先了解一下簇点链路。当请求进入微服务时&#xff0c;首先会访Controller、Service、Ma…

cos + vue + Element UI 上传文件的实现

这是将本地文件上传到腾讯云服务器的基本方法&#xff0c;官方也有相应的文档&#xff0c;需要的同学可以去官方文档查看。腾讯云官方文档&#xff0c;着急的同学可以 跟着以下步骤快速实现。 &#xff08;1&#xff09;安装 SDK 并引入 安装&#xff1a; npm i cos-js-sdk-…

赋能智慧校园!A3D数字孪生可视化,轻量又高效!

放假之后&#xff0c;学生们会逐步返学&#xff0c;大量人员出入校园&#xff0c;安全更是不容忽视&#xff0c;如何在短时间内对大批人员及设施进行智能监管&#xff1f;数字化转型是关键手段&#xff0c;我们可以融合线上线下数据&#xff0c;搭建3D立体的智慧校园&#xff0…

Unity 按下Play键后,Scene View里面一切正常,但是Game View中什么都没有 -- Camera Clear Flags的设置

问题如下所示。 最先遇到这个问题是我想用Unity开发一个VR 360-degree Image Viewer。在Scene View中可以看到球体&#xff0c;但是Game View什么都看不到。最后找到的原因是&#xff0c;我使用的shader是Skybox/Panorama&#xff0c; 需要把Main Camera的Clear Flags设置成Do…

hanoi塔

hanoi塔问题&#xff1a; 1.规则&#xff1a;一次移动一个盘子&#xff0c;小盘子压大盘子上面&#xff0c;有A、B、C三个柱子&#xff0c;A是起始放盘子的柱子&#xff0c;B是中间可以借助的柱子&#xff0c;C是最后放盘子的位置 2.简单思路&#xff1a; 如果有1个盘子&…