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解法

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

尚硅谷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分析工…

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;代码整洁&#…

测开——基础理论面试题整理

1. 测试流程 需求了解分析需求评审制定测试计划【包括测试人员、时间、每人负责的模块、测试的风险项以及预防】编写自动化测试用例 —— 测试评审【尽量丰富测试点】编写测试框架和脚本&#xff08;若是功能测试 可省去这步骤&#xff09;执行测试提交缺陷报告测试分析与评审…

Coursera上托福专项课程02:TOEFL Speaking and Writing Sections Skills Mastery 学习笔记

TOEFL Speaking and Writing Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-speaking-writing-sections-skills-mastery 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 TOEFL Speaking and Writing…

docker-ce部署

目录 1. 更新软件包列表 2. 安装必要的软件包&#xff0c;以允许 apt 使用 HTTPS 3. 添加 Docker 的官方 GPG 密钥 4. 设置 Docker CE 的稳定存储库 5. 再次更新包索引以及安装 Docker CE 6. 验证 Docker CE 是否正确安装 7. 将当前用户添加到 docker 用户组&#xff0c;…

Linux之shell脚本编辑工具awk

华子目录 概念工作流程工作图流程&#xff08;按行处理&#xff09; awk程序执行方式1.通过命令行执行awk程序实例 2.awk命令调用脚本执行实例 3.直接使用awk脚本文件调用实例 awk命令的基本语法格式BEGIN模式与END模式实例awk的输出 记录和域&#xff08;记录表示数据行&#…