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.hqwc.cn/news/596142.html

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

相关文章

继电器线圈两端为什么要反向并联二极管

原理描述: 电感的特点:穿过电感的电流不会突然变化,也就是说变化的电流在电感上面会产生感应电动势。 感应电动势的作用:阻碍电流的变化。 三极管断开之前,电流是穿过线圈,原来的电流是从上往下流动&#…

【C++】探索C++中的类与对象(下)---深入理解C++中的关键概念与应用

​​ 🌱博客主页:青竹雾色间. 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ✨人生如寄,多忧何为 ✨ 在C编程中,有许多重要的概念和特性,包括构造函数、explicit关键字、静态成员、友元以及内部类…

【黑马头条】-day05延迟队列文章发布审核-Redis-zSet实现延迟队列-Feign远程调用

文章目录 昨日回顾今日内容1 延迟任务1.1 概述1.2 技术对比1.2.1 DelayQueue1.2.2 RabbitMQ1.2.3 Redis实现1.2.4 总结 2 redis实现延迟任务2.0 实现思路2.1 思考2.2 初步配置实现2.2.1 导入heima-leadnews-schedule模块2.2.2 在Nacos注册配置管理leadnews-schedule2.2.3 导入表…

【Leetcode】1. 两数之和

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给定一个整数数组 n u m s nums nums 和一个整数目标值 t a r g e t target target,请你在该数组中找出 和为目标值 t a r g e t target target 的那 两个 整数&…

序列超图的下一项推荐 笔记

1 Title Next-item Recommendation with Sequential Hypergraphs(Jianling Wang、Kaize Ding、Liangjie Hong、Huan Liu、James Caverlee)【SIGIR 2020】 2 Conclusion This study explores the dynamic meaning of items in realworld scenarios and p…

JAVA IO流学习

File类: File类是java.io包中很重要的一个类 File类的对象可以代表一个文件或者目录,可以修改文件大小、文件最后修改日期、文件名等 File对象不能操作文件的具体数据,即不能对文件进行读和写的操作 File的构造方法: File&…

并查集学习(836. 合并集合 + 837. 连通块中点的数量)

//得先加集合个数再合并!!!!!!!!! 核心代码: int find(int x){//返回父节点if(x ! p[x]) {p[x] find(p[x]);//路径压缩 } //孩子不等于爸爸,就…

Pytorch转onnx

pytorch 转 onnx 模型需要函数 torch.onnx.export。 def export(model: Union[torch.nn.Module, torch.jit.ScriptModule, torch.jit.ScriptFunction],args: Union[Tuple[Any, ...], torch.Tensor],f: Union[str, io.BytesIO],export_params: bool True,verbose: bool False…

【QT+QGIS跨平台编译】056:【pdal_json_schema+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_json_schema介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_json_schema介绍 pdal_json_schema 是与 PDAL(Point Data Abstraction Library)相关的 JSON 模式文件。PDAL 是一个用于处理和分析点云数据的开源库。JSON 模式…

DHCP-PXE

Dynamic Host Configuration Protocol 动态主机配置协议 1.Selinux 调试为Permission 防火墙配置 搭建DHCP的主机必须有一个静态地址,提前配置好 安装DHCP软件 服务名为dhcpd DHCP地址分配四次会话, DISCOVERY发现 OFFER 提供 REQUEST 回应 A…

5G网络架构及技术(二):OFDM一

ToDo: 等把这些讲义看完后得单开一个文章整理思维导图   该部分由于内容比较重要,OFDM是5G物理层的基础,但学习时直接跳到5G OFDM去看它的那些参数设置感觉没什么意义,还得从发展的角度进行学习,先从最先用到OFDM的WiFi协议开始…

WCH恒沁单片机-CH32V307学习记录2----FreeRTOS移植

RISC-V 单片机 FreeRTOS 移植 前面用了 5 篇博客详细介绍了 FreeRTOS 在 ARM Cortex-M3 MCU 上是如何运行的。 FreeRTOS从代码层面进行原理分析系列 现在我直接用之前的 RISC-V MCU 开发板子(CH32V307VCT6)再次对 FreeRTOS 进行移植,其实也…