【C++高阶数据结构】LRU

news2024/11/27 2:18:52

​ 🏆个人主页:企鹅不叫的博客

​ 🌈专栏

  • C语言初阶和进阶
  • C项目
  • Leetcode刷题
  • 初阶数据结构与算法
  • C++初阶和进阶
  • 《深入理解计算机操作系统》
  • 《高质量C/C++编程》
  • Linux

⭐️ 博主码云gitee链接:代码仓库地址

⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!

💙系列文章💙

【C++高阶数据结构】并查集

【C++高阶数据结构】图


文章目录

  • 💙系列文章💙
  • 💎一、概念
  • 💎二、OJ


💎一、概念

缓存空间满了之后,更新数据,我要进入,谁出去呢?

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。,将最近最少被使用的算法替换出去。(包括读和写)

💎二、OJ

LRU缓存

在这里插入图片描述
思路:

要调整_LRUList中key的位置到头部,更新顺序

但是我们不知道数据在哪里,只能遍历查找,这个就变成了O(N)
我们找到了数据,我们还需要知道在链表中的位置
所以我们下面用了unorder_map<int,iterator>作为映射,记录当前的key在我们链表中对应的位置
然后用一个list<int,int>来记录我们题目要求的<key,value>

class LRUCache {
public:
    LRUCache(int capacity) 
    :_capacity(capacity){
        
    }
    
    int get(int key) {
        //返回_hashmap中存key的迭代器
        auto ret=_hashMap.find(key);
        //如果存在
        if(ret !=_hashMap.end())
        {
            //更新key对应的值的位置
            //ret的second是对应的值在链表里面的迭代器的位置
            LtIter it=ret->second;
            //splice 转移节点
            _LRUList.splice(_LRUList.begin(),_LRUList,it);
            //ret->second找到的是在链表中的迭代器的位置再->second就是找到第二个元素也就是存的具体的数据
            return  ret->second->second;
        }
        else
        {
            return -1;
        }
    }
    
    void put(int key, int value) {
        //1、新增
        //2、更新
        auto ret=_hashMap.find(key);
        //如果当前的缓存中并没有存过这个ret
        if(ret ==_hashMap.end())
        {
            //如果满了,就需要先删除LRU的数据
            if(_capacity==_hashMap.size())
            {
                //根据题目的示例,我们需要删除尾部的数据
                pair<int,int> back=_LRUList.back();
                //根据back.first也就是键值在map中删除
                _hashMap.erase(back.first);
                //删除链表的最后一个节点
                _LRUList.pop_back();
            }
            //将新的键值添加到我们的链表最前面
            _LRUList.push_front(make_pair(key,value));
            //map中存的是key值和对应的在链表中的迭代器
            _hashMap[key]=_LRUList.begin();
        }
        //如果当前的缓存中已经存过了这个ret
        else{
            //更新key对应的值的位置
            //找到这个key值在链表中对应的位置
            LtIter it=ret->second;
            //更新这个key对应的键值
            it->second=value;//更新
            //splice 转移节点
            //将这个刚刚访问过的结点转移到链表的头部
            _LRUList.splice(_LRUList.begin(),_LRUList,it);
        }
    }
private:
    //hash保证查找更新是O(1)
    typedef list<pair<int,int>>::iterator LtIter;
    unordered_map<int,LtIter>_hashMap;
    //LRU 假设尾部的数据就是最近最少用
    list<pair<int,int>> _LRUList;
    //最大容量
    size_t _capacity;
};

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

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

相关文章

LeetCode刷题复盘笔记—一文搞懂动态规划之583. 两个字符串的删除操作问题(动态规划系列第四十篇)

今日主要总结一下动态规划的一道题目&#xff0c;583. 两个字符串的删除操作 题目&#xff1a;583. 两个字符串的删除操作 Leetcode题目地址 题目描述&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意…

ArcGIS基础实验操作100例--实验56 TIFF与GRID栅格转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验56 TIFF与GRID栅格转换 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

orika 工具下划线转驼峰不同字段名映射

1.问题: 业务需要把第三方接口的带下划线的字段规范为驼峰的字段 第三方接口的bean对象: public class ObjectsDetail extends XMLElementData implements Serializable {private static final long serialVersionUID 5080447582610246168L;private String objectclass;priv…

用300行Python代码实现一个人脸识别系统源码,基于dlib

用300行Python代码实现一个人脸识别系统 完整代码下载地址&#xff1a;用300行Python代码实现一个人脸识别系统源码&#xff0c;基于dlib 今天我们来python实现一个人脸识别系统&#xff0c;主要是借助了dlib这个库&#xff0c;相当于我们直接调用现成的库来进行人脸识别&…

科技云报道:“大建设”时期,AI算力何去何从?

科技云报道原创。 算力就是生产力&#xff0c;得算力者得天下。 随着新一代人工智能技术的快速发展和突破&#xff0c;以深度学习计算模式为主的AI算力需求呈指数级增长。 数据显示&#xff0c;在1960到2010年间&#xff0c;AI的计算复杂度每两年翻一番&#xff1b;在2010到2…

fastposter v2.11.0 天花板级的海报生成器

fastposter v2.11.0 天花板级的海报生成器 &#x1f525;&#x1f525;&#x1f525; fastposter海报生成器是一款快速开发海报的工具。只需上传一张背景图&#xff0c;在对应的位置放上组件&#xff08;文字、图片、二维&#x1f434;、头像&#xff09;即可生成海报。 点击代…

实验二十一 配置NAT

实验二十一 配置NAT实验要求&#xff1a; 静态NAT: 在Router的公网侧接口GE0/0/1下配置静态NAT&#xff0c;将私有 IP地址 192.168.0.2与公有IP地址202.10.1.3绑定起来。 NAT SERVER的配置 动态NAT和easy IP的配置网络拓扑图&#xff1a;操作步骤&#xff1a;一、静态NAT1、配置…

Actipro-wpf-controls-22.1.4 2023注册版

Actipro WPF 控件 用于构建漂亮的 Windows Presentation Foundation 桌面应用程序的大量 UI 控件 特征 超过 100 个 WPF 控件和组件在各种产品中可用&#xff0c;Ω578867473它们通过丰富的特性和功能改进应用程序的 UI。 受办公室启发的用户界面 复制现代 Office 应用程序的外…

【数据结构】计数排序、基数排序

文章目录计数排序基数排序计数排序 计数排序也是非比较排序的一种&#xff0c;在之前的博客介绍的都是比较排序&#xff0c;跟之前的比较排序相比计数排序并不是很常用&#xff0c;不常用的原因也是它的局限性耗费空间很大&#xff0c;只能对整数进行排序&#xff0c;并且数据在…

【验证码逆向专栏】某验四代滑块验证码逆向分析

文章目录声明逆向目标通讯流程验证码流程分析逆向分析captcha_id 参数challenge 参数w 参数结果验证声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与…

剑指 Offer 27. 二叉树的镜像(Leetcode 226. 翻转二叉树)(二叉树后序遍历)

题目&#xff1a; 链接&#xff1a;剑指 Offer 27. 二叉树的镜像&#xff1b;Leetcode 226. 翻转二叉树 难度&#xff1a;简单 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,…

调用Ishingami Homma解析函数测试PAWN算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 灵敏度分析分为局部灵敏度分析和全局灵敏度分析&#xff1b;局部灵敏度分析包括&#xff1a;直接求导法、有限差分法、格林函数…

06-07-Alibaba Nacos注册中心源码剖析

Nacos&Ribbon&Feign核心微服务架构图 架构原理 1、微服务系统在启动时将自己注册到服务注册中心&#xff0c;同时外发布 Http 接口供其它系统调用(一般都是基于SpringMVC) 2、服务消费者基于 Feign 调用服务提供者对外发布的接口&#xff0c;先对调用的本地接口加上注…

Github每日精选(第85期):PDF 文档的 React 组件react-pdf-viewer

react-pdf-viewer react-pdf-viewer 用于查看 PDF 文档的 React 组件。它是用 TypeScript 编写的&#xff0c;完全由 React hooks 提供支持。 github 的地址在这里。 使用实例 添加水印 默认情况下&#xff0c;每个页面由画布、文本和注释层构成。在此示例中&#xff0c;我…

RCE(命令执行)总结

文章目录RCE(命令、代码执行)总结1、过滤cat、flag等关键字1.1 常见linux系统命令1.2 使用转义符1.3 使用引号1.4 内联执行绕过1.5 编码绕过1.6 进制绕过1.7 过滤文件名(如&#xff1a; /etc/passwd文件)1.8 使用$*和$&#xff0c;$x,${x}1.9 读取文件命令1.10 查找文件命令(fi…

【观察】汇聚中国开源数据库创新力量,openGauss驶入发展“快车道”

毫无疑问&#xff0c;数据库是“软件产业皇冠上的明珠”&#xff0c;是数字基础设施不可或缺的底座之一。但也要看到&#xff0c;由于数据库难度大&#xff0c;产业投入周期长&#xff0c;迫切需要凝聚产业力量共建基础能力。在此背景之下&#xff0c;作为定位企业级开源数据库…

H264 NALU分析以及提取h264实战

1.H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准⾥称 为H.264&#xff0c;在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10&#xff0c;⼜叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4 AVC或直…

Java学习(22)调试初步——debug入门

程序调试-debug 调试的作用 让程序员能看清程序每一步的效果&#xff0c;在需要查看结果的时候&#xff0c;使用debug查看实际结果是否与预期结果一致。案例 (1) 设置断点 鼠标左键双击设置/取消&#xff0c;或者右键选择Toggle Breakpoint。 (2) 执行调试 Run→\to→Debug&a…

快速了解chrony服务器

目录 一、chrony服务器 二、chrony安装与配置 三、时间服务器 四、配置时间服务器 一、chrony服务器 Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步&#xff0c;因此让你的计算机…