LRU的原理与实现(java)

介绍

LRU的英文全称为Least Recently Used,即最近最少使用。它是一种内存数据淘汰算法,当添加想要添加数据而内存不足时,它会优先将最近一段时间内使用最少的数据淘汰掉,再将数据添加进来。

原理

LRU的原理在介绍中就已经基本说明过了,就是在内存不够用时把最近最少使用的数据淘汰掉,

那么它为什么会这么进行淘汰呢?其主要思想是最近时间内使用的比较多的数据数据在后面的使用中就大概率还会被被使用,而最近使用比较少的数据在后面被使用的概率就比较低。使用这样的淘汰算法,在访问内存时就可以提高内存的命中率,提高整体系统的速度。

下面来举个例子。假设内存中只能存4个数据。我们依次添加了1,2,3,4这4个数据,在添加完后我访问了3和1,随后我继续添加数据,加入一个5,那么此时淘汰的数据为2,因为1和3最近已经使用过了,2时最近一段时间内使用最少的数据。流程如下:

实现

想要使用程序来实现一个简单的LRU算法可以使用单链表。将一个单链表看成我们的内存,每次有数据进来时就在头部添加进来,淘汰时就将单链表尾部的最后一个节点淘汰。当每次访问时就把访问的节点移动到头节点。

首先定义链表节点的结构

    //定义单链表public static class Node{int val;Node next;Node(){};Node(int val){this.val=val;};Node(int val,Node next){this.val = val;this.next = next;}}

随后定义链表的最大容量,和链表的根节点和当前链表中的节点数

    public static int size = 4;public static int curSize = 0;public static Node root=new Node(0);

再编写向链表添加节点的方法

分为三种情况

情况一:链表未满,那么这就将该节点插入到链表的头部,并将curSize加一。

情况二:添加的节点时链表已满,此时需要我们将链表的最后一个节点淘汰掉,然后该节点插入头部。

    /*** 向链表中添加* @param val*/public static void LRUAdd(int val){if(curSize==0){Node node = new Node(val);root.next = node ;curSize++;}//链表已满else if(curSize==size){Node node = new Node(val);node.next = root.next;root.next = node;Node pre = null;Node cur = root;while (cur.next!=null){pre = cur;cur=cur.next;}pre.next = null;}else {Node node = new Node(val);node.next = root.next;root.next = node;curSize++;}}

随后编写访问节点的方法,访问某节点时会将该节点直接移动到链表头部。

    public static void LRUGet(int val){Node node = root.next;Node pre = root;while(node!=null){if(node.val==val){break;}pre = node;node=node.next;}if(node.next==null){Node node1 = new Node();node1.next = node;node.next = root.next;root.next = node;pre.next = null;}else {pre.next = node.next;node.next = root.next;root.next = node;}node.toString();}

测试例子中的数据:

先添加12345这5个数据,再访问3和2,最后再添加6

可以看到我们成功实现了LRU算法

完成代码

public class Lru {public static int size = 4;public static int curSize = 0;public static Node root=new Node(0);public static void main(String[] args) {LRUAdd(1);LRUAdd(2);LRUAdd(3);LRUAdd(4);LRUAdd(5);show();LRUGet(3);show();LRUGet(2);show();LRUAdd(6);show();}//定义单链表public static class Node{int val;Node next;Node(){};Node(int val){this.val=val;};Node(int val,Node next){this.val = val;this.next = next;}}/*** 向链表中添加* @param val*/public static void LRUAdd(int val){if(curSize==0){Node node = new Node(val);root.next = node ;curSize++;}//链表已满else if(curSize==size){Node node = new Node(val);node.next = root.next;root.next = node;Node pre = null;Node cur = root;while (cur.next!=null){pre = cur;cur=cur.next;}pre.next = null;}else {Node node = new Node(val);node.next = root.next;root.next = node;curSize++;}}//访问节点public static void LRUGet(int val){Node node = root.next;Node pre = root;while(node!=null){if(node.val==val){break;}pre = node;node=node.next;}if(node.next==null){Node node1 = new Node();node1.next = node;node.next = root.next;root.next = node;pre.next = null;}else {pre.next = node.next;node.next = root.next;root.next = node;}node.toString();}public static void show(){Node node = root.next;System.out.println("当前链表为:");while(node!=null){System.out.print(node.val+" ");node = node.next;}System.out.println("");}}

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

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

相关文章

机器学习模型——逻辑回归

https://blog.csdn.net/qq_41682922/article/details/85013008 https://blog.csdn.net/guoziqing506/article/details/81328402 https://www.cnblogs.com/cymx66688/p/11363163.html 参数详解 逻辑回归的引出: 数据线性可分可以使用线性分类器,如果…

蓝桥真题--路径之谜DFS解法

路径之谜 思路 前置知识:深度搜索模板搜索所有可以找的路径,将走过的靶子减去一走到最后一个格子的时候,直接去判断所有的靶子只有除最后一个位置的靶子,其余靶子都归零的时候,判断一个最后一个位置横坐标和纵坐标的靶…

[深度学习]yolox训练参数含义

yolox训练数据的入口为YOLOX-main/tools/train.py。main函数中通过get_exp获取训练过程相关的超参数。 其中train.py中的make_parser函数的参数解析如下: -expn: 训练过程数据保存的位置,默认位置是tools/YOLOX_outputs中的目录,如果指定-e…

尚硅谷html5+css3(1)

1.基本标签&#xff1a; <h1>最大的标题字号 <h2>二号标题字号 <p>换行 2.根标签<html> 包括<head>和<body> <html><head><title>title</title><body>body</body></head> </html> 3…

MATLAB - 用命令行设计 MPC 控制器

系列文章目录 前言 本例演示如何通过命令行创建和测试模型预测控制器。 一、定义工厂模型 本示例使用《使用 MPC Designer 设计控制器》中描述的工厂模型。创建工厂的状态空间模型&#xff0c;并设置一些可选的模型属性&#xff0c;如输入、状态和输出变量的名称和单位。 % co…

正确使用@Resource

目录 1 怎么使用Resource&#xff1f;1.0 实验环境1.1 通过字段注入依赖1.2 bean property setter methods &#xff08;setter方法&#xff09; 2 打破岁月静好&#xff08;Resource takes a name attribute&#xff09;2.1 结论2.2 那我不指定呢&#xff1f;【结论&#xff1…

Seata(分布式事务集成测试和总结)

文章目录 1.集成测试1.集成测试正常下单1.步骤2.浏览器访问 http://localhost:10008/order/save?userId666&productId1&nums1&money1003.注意事项和细节 2.集成测试模拟异常1.步骤1.com/sun/springcloud/controller/StorageController.java 休眠12s&#xff0c;模…

自动驾驶执行层 - 线控底盘基础原理(非常详细)

自动驾驶执行层 - 线控底盘基础原理(非常详细) 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1. 前言 1.1 线控的对象 在自动驾驶行业所谓的“感知-定位-决策-执行”的过程中&#xff0c;在末端的执行层&#xff0c;车辆需要自主执行决策层所给出的指令&#xff0c;具体…

leetcode(HOT100)——链表篇

1、相交链表 本题思路就是定义两指针&#xff0c;指向两链表的同一起跑线&#xff0c;然后共同往前走&#xff0c;边走边判断两链表的节点是否相等&#xff0c; 代码如下&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* L…

Android14应用启动流程(源码+Trace)

1.简介 应用启动过程快的都不需要一秒钟&#xff0c;但这整个过程的执行是比较复杂的&#xff0c;无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一&#xff0c;本文采用Android14源码与perfetto工具进行解析。 源码参考地址&#xff1a;Search trace分析工…

网络工程师练习题(10)

网络工程师 危机系统中&#xff0c;程序计数器不属于CPU的运算器组成部件。Python语言的特点不包括编译型。软件测试时&#xff0c;白盒测试不能发现功能错误。云计算有多种部署模型&#xff0c;当云以服务的方式提供给大众时&#xff0c;称为公有云。某工厂使用一个软件系统实…

为啥python’hello‘>‘world‘是false

字典序&#xff0c;也称为字典顺序或词典序&#xff0c;是一种用于排序和比较字符串的方法。它模拟了字典中单词的排序方式&#xff0c;按照字母的顺序进行比较。 在字典序中&#xff0c;字符串的比较是从左到右逐个字符进行的。首先比较第一个字符&#xff0c;如果相同&#…

P4549 裴蜀定理

题目描述 给定一个包含 n n n 个元素的整数序列 A A A&#xff0c;记作 A 1 , A 2 , A 3 , . . . , A n A_1,A_2,A_3,...,A_n A1​,A2​,A3​,...,An​。 求另一个包含 n n n 个元素的待定整数序列 X X X&#xff0c;记 S ∑ i 1 n A i X i S\sum\limits_{i1}^nA_i\…

2024.4.5|牛客小白月赛90

2024.4.5|牛客小白月赛90 A.小A的文化节 B.小A的游戏 C.小A的数字 D.小A的线段&#xff08;easy version&#xff09; E.小A的任务 F.小A的线段&#xff08;hard version&#xff09; 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c…

[报错解决]源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

目录 报错信息解决办法 spring整合mvc时&#xff0c;遇到的404报错&#xff0c;梳理mvc知识供参考供 报错信息 解决办法 Controller RequestMapping("user") public class UserController {//spring整合webmvc// 请求地址 http://localhost:7070/user/quickRequest…

数据字典

文章目录 一、需求分析二、表设计&#xff08;两张表&#xff09;三、功能实现3.1 数据字典功能3.1.1 列表功能3.1.2 新增数据字典3.1.3 编辑数据字典 3.2 数据字典明细3.2.1 列表功能3.2.2 新增字典明细3.2.3 编辑字典明细 3.3 客户管理功能3.3.1 列表功能3.3.2 新增用户3.3.3…

Golang | Leetcode Golang题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; func maxArea(height []int) int {res : 0L : 0R : len(height) - 1for L < R {tmp : math.Min(float64(height[L]), float64(height[R]))res int(math.Max(float64(res), tmp * float64((R - L))))if height[L] < height[R] {L} el…

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改

目录 前言 基本概念&理解 注意的点 查看环境变量方法 PATH环境变量 PTAH应用系统指令 PTAH应用用户程序 命令行的修改&#xff08;内存级&#xff09; 配置文件的修改 windows环境变量 大家天天开心&#x1f642; bash进程的流程。环境变量在系统指令和用户…

Linux网卡IP地址配置错误的影响

在Linux系统中&#xff0c;网络配置是保持系统顺畅运行的关键一环。正确配置网卡的IP地址对于确保网络通信的准确性和效率至关重要。然而&#xff0c;如果在这个过程中发生错误&#xff0c;可能会带来一系列问题。让我们一起探讨一下&#xff0c;如果Linux网卡的IP地址配置错误…

Python+Yolov8框选位置目标识别人数统计计数

程序示例精选 PythonYolov8框选位置目标识别人数统计计数 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonYolov8框选位置目标识别人数统计计数》编写代码&#xff0c;代码整洁&#…