理解和实现 LRU 缓存置换算法

引言

在计算机科学中,缓存是一种用于提高数据访问速度的技术。然而,缓存空间是有限的,当缓存被填满时,就需要一种策略来决定哪些数据应该保留,哪些应该被淘汰。LRU(最近最少使用)算法是一种广泛使用的缓存淘汰策略,它基于一个简单的假设:如果数据最近被访问过,那么它在未来也更有可能被访问。

LRU算法简介

LRU算法的核心思想是:在缓存空间不足时,淘汰最长时间未被访问的数据项。这种策略适用于多种场景,包括Web缓存、数据库查询缓存、操作系统的页面置换等。

LRU算法的工作原理

LRU算法通常需要两种数据结构来实现:

哈希表:提供O(1)时间复杂度的数据访问和插入。
双向链表:维护数据项的使用顺序,最近使用的在头部,最久未使用的在尾部。

数据访问和插入的流程如下:

获取数据(Get):从缓存中获取数据,如果数据存在(缓存命中),则将该数据移到链表头部;如果数据不存在(缓存未命中),返回 -1。
放入数据(Put):将数据放入缓存,如果数据已经存在,则更新数据值并将该节点移到链表头部;如果数据不存在,则在链表头部插入新的节点,如果缓存已满,还需要移除链表尾部的节点。

LRU算法的实现

class LRUCache {/**整体思路:定义双向循环链表和Map,其中Map的key存储key,value存储链表节点.为什么定义双向循环链表,因为这样定义就不需要定义额外的头尾节点*/static class Node{Node prev, next;int key, val;public Node(int key, int val){this.key = key;this.val = val;}}private Node dummy = new Node(-1,-1);Map<Integer, Node> mp = new HashMap<>();private int capacity;public LRUCache(int capacity) {this.capacity = capacity;dummy.prev = dummy;dummy.next = dummy;}public int get(int key) {// 判断是否在缓存Node node = mp.get(key);// 不在,直接返回-1if(node == null) return -1;// 在,就把当前节点移动到前面moveToHead(node);// 返回节点值return node.val;}public void put(int key, int value) {// 判断是否在缓存Node node = mp.get(key);// 在,就把当前节点移动到前面if(node != null){// 更新node.valnode.val = value;moveToHead(node);}else{// 不在,就加入node = new Node(key, value);mp.put(key, node);// 将新节点加入到头部insert(node);// 如果当前容量大于LRU容量,就移出if(mp.size() > capacity){// 找到尾节点node = dummy.prev;// 删除尾节点del(node);// 从缓存移出对应的keymp.remove(node.key);}}}// 移动当前节点到头节点public void moveToHead(Node node){del(node);insert(node);}// 插入头部public void insert(Node node){node.prev = dummy;node.next = dummy.next;dummy.next.prev = node;dummy.next = node;}// 删除节点public void del(Node node){node.prev.next = node.next;node.next.prev = node.prev;}
}

LRU算法的优势与局限

LRU算法的优势在于其简单性和效率。它能够快速地识别并淘汰最久未使用的数据项。然而,LRU也有局限性,它可能不适用于所有类型的访问模式,特别是那些具有周期性或随机性访问模式的场景。另外,在某些情况下,LRU 缓存可能会频繁地移除和加载数据,导致缓存抖动。这种现象在缓存大小接近于工作集大小时尤为明显。

结论

LRU算法是一种高效且广泛使用的缓存淘汰策略,适用于多种需要缓存的场景。通过理解其工作原理和实现方式,我们可以更好地利用缓存来提高系统性能。随着技术的发展,对LRU算法的优化和变种也在不断涌现,为不同的应用场景提供了更多的选择。

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

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

相关文章

UML实现图-部署图

概述 部署图(Deployent Diagram)描述了运行软件的系统中硬件和软件的物理结构。部署图中通常包含两种元素:节点和关联关系&#xff0c;部署图中每个配置必须存在于某些节点上。部署图也可以包含包或子系统。 节点是在运行时代表计算机资源的物理元素。节点名称有两种:简单名和…

android studio开发时提示 TLS 握手错误解决办法

我用的是windows&#xff0c;遇到了这错误&#xff0c; The server may not support the clients requested TLS protocol versions: (TLSv1.2, TLSv1.3). You may need to configure the client to allow other protocols to be used. For more on this, please refer to http…

苍穹外卖笔记-08-套餐管理-增加,删除,修改,查询和起售停售套餐

套餐管理 1 任务2 新增套餐2.1 需求分析和设计接口设计setmeal和setmeal_dish表设计 2.2 代码开发2.2.1 根据分类id查询菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

c++替换字符或字符串函数

在C中&#xff0c;有多种方法可以替换字符串或字符。下面是一些常用的方法&#xff1a; 使用replace函数&#xff1a; replace函数可以替换字符串中的指定字符或子字符串。它的用法如下&#xff1a; string str "Hello World"; str.replace(str.find("World&qu…

Nginx03-动态资源和LNMP介绍与实验、自动索引模块、基础认证模块、状态模块

目录 写在前面Nginx03案例1 模拟视频下载网站自动索引autoindex基础认证auth_basic模块状态stub_status模块模块小结 案例2 动态网站&#xff08;部署php代码&#xff09;概述常见的动态网站的架构LNMP架构流程数据库Mariadb安装安全配置基本操作 PHP安装php修改配置文件 Nginx…

AI做的2024年高考数学试卷,答案对吗?

2024年高考数学考试已经结束&#xff0c;现在呈上数学真题及AI给出的解答。供各位看官欣赏。 总的来说&#xff0c;人工做题两小时&#xff0c;AI解答两分钟。 但是&#xff0c;AI做的答案是否正确&#xff0c;那就要各位看官来评判了&#xff01; 注&#xff1a;试卷来源于…

【Linux】另一种基于rpm安装yum的方式

之前的163的镜像源504网关异常了&#xff0c;网上找到的方法基本都是基于apt&#xff0c;或是基于apt-get。找到了大佬帮忙装了一下&#xff0c;记录如下&#xff1a; wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm…

2024年5大制作AI电子手册工具推荐

AI电子手册作为一种结合了人工智能技术和传统电子手册功能的新型工具&#xff0c;逐渐成为了企业进行知识管理和信息传递的重要工具&#xff0c;为企业提高效率、优化用户体验。在本文中&#xff0c;LookLook同学将简单介绍一下什么是AI电子手册、对企业有什么好处&#xff0c;…

JAVA面试中,面试官最爱问的问题。

Optional类是什么&#xff1f;它在Java中的用途是什么&#xff1f; Java中的Optional类是一个容器类&#xff0c;它用于封装可能为空的对象。在Java 8之前&#xff0c;空值检查是Java编程中一个常见的问题&#xff0c;尤其是在处理返回单个值的方法时。Optional类提供了一种更…

电源变压器的作用和性能

电源变压器的主要作用是改变输入电压的大小&#xff0c;通常用于降低电压或升高电压&#xff0c;以便适应不同设备的需求。它们还可以提供隔离&#xff0c;使得输出电路与输入电路之间电气隔离&#xff0c;从而提高安全性。性能方面&#xff0c;电源变压器需要具有高效率、低温…

Unity3D测量距离实现方法(一)

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、Unity距离测量1-1 制作预制体1-2 编写测量的脚本 &#x1f449;二、鼠标点击模型进行测量&#x1f449;二、字体面向摄像机的方法&#x1f449;二、最短距离测量方法&#x1f449;三、壁纸分享…

Python中的装饰器链(decorator chain)是什么

在Python中&#xff0c;装饰器是一种高级功能&#xff0c;它允许你在不修改函数或类代码的情况下&#xff0c;为它们添加额外的功能。装饰器通常用于日志记录、性能测量、权限检查等场景。当多个装饰器应用于同一个函数或类时&#xff0c;它们会形成一个装饰器链&#xff08;de…

Go语言中,公司gitlab私有仓库依赖拉取配置

为什么要考虑私有仓库 Go语言目前都已经采用了官方统一的 go modules 来管理依赖&#xff0c;后续也不太可能出现比较乱的生态&#xff0c; 因此了解下如何让这个依赖管理正常工作是非常必要的。 对于Github或者其他公有仓库&#xff0c;依赖管理是非常直接和方便的,设置好GO…

C++ 依赖的C库查看和下载

依赖库查询&#xff1a;ldd 指令 # ldd libcyber.solinux-vdso.so.1 (0x0000ffff86b52000)libopt_proto.so > /home/caros/cyberrt/lib/libopt_proto.so (0x0000ffff84c4a000)libboost_filesystem.so.1.73.0 > /opt/orin/usr/local/lib/libboost_filesystem.so.1.73.0 (…

Java版工程项目管理平台:以源码驱动,引领工程企业数字化转型

在当今数字化时代&#xff0c;随着企业的扩张和业务的增长&#xff0c;传统的工程项目管理方法已显不足。为了提升管理效率、减轻工作负担、增强信息处理的快速性和精确度&#xff0c;工程企业亟需借助数字化技术进行转型升级。本文将向您展示一款基于Spring Cloud、Spring Boo…

SS2D反向传播问题记录【未解决】

使用SS2D写了一个简单的神经网络进行训练&#xff0c;但是训练报错&#xff1a; NotImplementedError: You must implement either the backward or vjp method for your custom autograd.Function to use it with backward mode AD. 环境&#xff1a; CUDA11.8 torch2.0.0 mam…

AI大模型日报#0607:10家国产大模型、GPT-4o挑战高考作文 | OpenAI公开破解GPT-4新方法

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

TS 系列:使用元祖生成联合类型

需求&#xff1a;有这么个需求&#xff0c;我们有两个数组&#xff0c;一个记录扑克牌花色&#xff0c;一个记录扑克牌点数&#xff0c;需要有一个函数&#xff0c;传递两个值&#xff0c;根据传递的值生成扑克牌&#xff0c;需要我们定义参数的类型检查。 思路&#xff1a;肯…

2024速通python之python高阶技巧

文章目录 一、闭包1.什么是闭包2.优缺点3.nonlocal关键字 二、装饰器1.什么是装饰器2.举例3.传统方式4.装饰器方式5.语法糖写法 三、多线程1.线程参数2.多线程编程 四、网络编程1.Socket服务端编程2.Socket客户端编程 「章节总览」       【2024速通python之python基础…

超过20W个高质量组件的开源PCB库

项目介绍 Celestial Altium Library是由Altium行业专家Mark Harris创建的一个庞大的免费开源数据库库&#xff0c;专为Altium Designer而设计&#xff0c;库中包含超过20万个优质组件 . 特点 高质量数据&#xff1a;Celestial Altium Library注重数据的质量&#xff0c;用户可…