LRU Cache【理论讲解 + 代码实现】

news2025/1/11 16:44:21

LRU Cache

    • 📖1. 什么是LRU Cache
    • 📖2. 为什么需要LRU算法?
    • 📖3. LRU Cache的实现

📖1. 什么是LRU Cache

LRU是Least Recently Used的缩写,意思是最近最少使用. 它是一种Cache替换算法.

什么是Cache?

狭义的Cache是指位于CPU和主存之间的快速RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术. 广义上的Cache指的是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构. 除了CPU与主存之间有Cache,内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache-称为Internet临时文件或网络内容缓存等.

image-20221130232910001

📖2. 为什么需要LRU算法?

Cache的容量有限,因此当Cache的容量用完后(其实它不会真的用完,会有一个水位线,如果剩余容量低于这个水位线就需要执行LRU算法),而又有新的内容要添加进来时,就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容. LRU Cache替换原则就是将最近最少使用的内容替换掉.

其实,LRU译成最久未使用会更形象,因为该算法每次替换掉的就是一段时间内最近没使用过的内容.

📖3. LRU Cache的实现

实现LRU Cache的方法和思路很多,但是要保持高效实现O(1)的putget,那么使用双向链表和哈希表的搭配是最高效和经典的. 使用双向链表是因为双向链表可以实现任意位置O(1)的插入和 删除,使用哈希表是因为哈希表的增删查改也是O(1).

image-20221130235350517

LRU设计要求:

image-20221130233651753

LRU算法分析过程:

image-20221201000232268

最终实现代码:

class LRUCache {
    using Lter = list<pair<int, int>>::iterator;
public:
    LRUCache(int capacity)
        :_capacity(capacity)
    {}
    
    int get(int key) 
    {
        auto ret = _hashMap.find(key);
        if(ret != _hashMap.end())
        {
            //找到了
            Lter it = ret->second; //拿到了指向链表的迭代器
            _LRUList.splice(_LRUList.begin(), _LRUList, it);

            return it->second;
        }

        return -1;
    }
    
    void put(int key, int value) 
    {
        auto ret = _hashMap.find(key); 
        if(ret != _hashMap.end())
        {
            //修改value值即可
            Lter it = ret->second;  //拿到链表迭代器
            it->second = value;

            //将当前key节点移至链表开头
            _LRUList.splice(_LRUList.begin(), _LRUList, it);
        }
        else
        {
            //检查容量
            if(_hashMap.size() == _capacity)
            {
                pair<int, int> back = _LRUList.back();
                _LRUList.pop_back();
                _hashMap.erase(back.first);
            }

            //添加key-value对
            _LRUList.push_front({key, value});
            _hashMap[key] = _LRUList.begin();
        }
    }

private:
    unordered_map<int, Lter> _hashMap;
    list<pair<int, int>> _LRUList;
    int _capacity;
};

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

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

相关文章

校园论坛(Java)—— 登录注册和用户信息模块

校园论坛&#xff08;Java&#xff09;—— 登录注册和用户信息模块 文章目录校园论坛&#xff08;Java&#xff09;—— 登录注册和用户信息模块1、写在前面2、系统结构设计2.1 各个页面之间的调用关系2.2. 登录注册模块各层的设计3、登录注册模块设计3.1 用户注册功能3.2 用户…

HighTec 工程配置详解

HighTec 工程配置详解 编译配置 构建配置管理器 管理器内&#xff0c;可以创建各种不同用途的配置项。例如用于生产工程的 ROM 配置&#xff0c;用于调试工程的 Debug 配置。对于每个配置&#xff0c;所设置的工程属性是单独分开的&#xff0c;互相之间没有影响。 打开构建配…

[附源码]计算机毕业设计springboot咖啡销售平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Unity复刻骑砍中的帝国象棋(一)

Unity复刻骑砍中的帝国象棋&#xff08;一&#xff09; 起因和简介 这两天从一款游戏中发现了这么个棋类小游戏&#xff0c;觉得挺有意思&#xff0c;没错&#xff0c;就是下面这个&#xff1a; 作为程序员的我&#xff0c;一下就想到复刻它一下。这个棋类小游戏&#xff0c…

【程序人生】4年创作纪念日,不忘初心,继续前行

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

JavaScript --04. 流程控制语句介绍

文章目录流程控制1 代码块1.1 声明代码块1.2 let 和 var的作用域2 条件判断语句 -- if语句3 条件分支语句3.1 if-else语句3.2 if-else if-else语句3.3 练习4 Switch语句5 循环语句5.1 While循环5.2 do-while循环5.3 for循环5.4 嵌套循环6 break和continue6.1 break6.2 continue…

PTL智能拣货系统

一、PTL背景介绍 随着工业 4.0 理念持续扩展并被接受&#xff0c;智能制造将是中国制造业发展趋势。未来的生产企业不仅仅在生产过程中追求智能化&#xff0c;仓储、工具、设备智能化管理都会成为新的趋势。 现阶段物流仓储行业进入了一个快速的发展期&#xff0c;各种各样的…

辣椒疫霉RXLR效应子抑制植物免疫

文章信息 题目&#xff1a;A Phytophthora capsici RXLR effector targets and inhibits the central immune kinases to suppress plant immunity 刊名&#xff1a;New Phytologist 作者&#xff1a;Xiangxiu Liang&#xff0c;Daolong Dou et al. 单位&#xff1a;China …

微信无感知检测单项好友【WeTool 免费版】【微信如何检测单向好友?】

一.微信无感知检测单项好友 1.1 背景 因为最近业务的原因加了好多的陌生微信好友&#xff0c;难免有很多好友删了我&#xff0c;但是我还有他的微信&#xff0c;岂不是很占地方&#xff1f; 所以我琢磨如何检测这些单项好友【利用转账、拉群的方法太费时间】&#xff0c;我无…

[附源码]计算机毕业设计springboot拉勾教育课程管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

事件绑定(onclick,onfocus,onblur)

事件绑定(onclick,onfocus,onblur) 学习路线&#xff1a;JavaScript_DOM->事件绑定(onclick,onfocus,onblur)-> 事件绑定(onmouseout,onmouseover) ->事件绑定(onsubmit)表单提交 ->提交表单与验证表单案例 常用绑定方式 方式一&#xff1a;通过 HTML标签中的事…

Java Hash 碰撞

散列函数&#xff08;英语&#xff1a;Hash function&#xff09;又称散列算法、哈希函数&#xff0c;是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要&#xff0c;使得数据量变小&#xff0c;将数据的格式固定下来。 该函数将数据打乱混合…

获取windows硬件、软件信息的方法

1&#xff0c;方法1 systeminfo 该命令是Windows中用于显示关于计算机及其操作系统的详细配置信息&#xff0c;包括操作系统配置、安全信息、产品 ID 和硬件属性&#xff0c;如 RAM、磁盘空间和网卡和补丁信息等。 SYSTEMINFO [/S system [/U username [/P [password]]]] [/FO…

从阿里降薪百分之三十来了国企,没想到还是要加班!哭了!

从阿里进国企&#xff0c;图什么&#xff1f;图它降工资&#xff1f;图它技术强&#xff1f;当然是图它轻松不加班&#xff0c;稳定不裁员&#xff01;但如果像下面这位阿里程序员一样&#xff0c;降薪百分之三十进了国企&#xff0c;发现还是得加班&#xff0c;大概只能emo了.…

[附源码]Python计算机毕业设计Django的文成考研培训管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Ae 动态图形模板

哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何通过AePr导出和安装动态图形模板&#xff1f; 新建合成 首先&#xff0c;新建一个合成&#xff0c;然后点击文字工具&#xff0c;内容自定义&#xff08;例&#xff1a;一场彗星雨&#xff0c;隔断了时空&#…

【408篇】C语言笔记-第九章(数据结构概述)

文章目录第一节&#xff1a;逻辑结构与存储结构1. 逻辑结构2. 存储结构1. 顺序存储2. 链式存储3. 顺序存储与链式存储分析第二节&#xff1a;算法的评价&#xff08;时间复杂度与空间复杂度&#xff09;1. 算法定义2. 时间复杂度3. 空间复杂度第一节&#xff1a;逻辑结构与存储…

CentOS7安装GmSSL过程记录

近期因为项目需要上区块链&#xff0c;在集成过程中证书选择了国密SM2&#xff0c;于是开启了入坑之旅&#xff0c;由于整个过程反复多次&#xff0c;我的记录也可能存在遗漏&#xff0c;只能尽力记录&#xff0c;这也是我为什么熬夜也要写下这篇记录&#xff01; 环境说明Virt…

[附源码]Python计算机毕业设计Django的玉石交易系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

【Pandas数据处理100例】(九十三):Pandas使用all()函数判断DataFrame中的元素是否都为True

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…