java 最少使用(lru)置换算法_LRU算法详解及最简单的Java实现

更多内容,欢迎关注微信公众号:全菜工程师小辉~

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

LRU算法的表现

  1. 新数据插入到容器头部;
  2. 每当缓存命中(即缓存数据被访问),则将数据移到容器头部;
  3. 当容器满的时候,将容器尾部的数据丢弃。

实现LRU的方法

  1. 用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中所有的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,将被访问的数据项的时间戳置为0。当数组空间已满时,将时间戳最大的数据项淘汰。
  2. 利用一个链表来实现,每次新插入数据的时候将新数据插到链表的头部;每次缓存命中(即数据被访问),则将数据移到链表头部;那么当链表满的时候,就将链表尾部的数据丢弃。
  3. 利用链表和HashMap。当需要插入新的数据项的时候,如果新数据项在链表中存在(一般称为命中),则把该节点移到链表头部,如果不存在,则新建一个节点,放到链表头部,若缓存满了,则把链表最后一个节点删除即可。在访问数据的时候,如果数据项在链表中存在,则把该节点移到链表头部,否则返回-1。这样一来在链表尾部的节点就是最近最久未访问的数据项。HashMap提供快速定位功能,具体可以参见下文。

比较三种方法优劣:

对于第一种方法,需要不停地维护数据项的访问时间戳,另外,在插入数据、删除数据以及访问数据时,时间复杂度都是O(n)。对于第二种方法,链表在定位数据的时候时间复杂度为O(n)。所以在一般使用第三种方式来是实现LRU算法。

LinkedHashMap的实现方案

LinkedHashMap继承于HashMap,来一张LinkedHashMap的结构图

a345c9a4b9e96c21296e41bc1eb14aff.png

LinkedHashMap的结构图

其中next是用于维护HashMap指定table位置上连接的Entry的顺序的,before、after是用于维护Entry插入的先后顺序的

LinkedHashMap底层就是用的HashMap加双链表实现的。实现LRU算法主要有两个注意的地方:

  1. LinkedHashMap本身已经实现了按照访问顺序的存储。LinkedHashMap的构造函数中有一个accessOrder参数,平时使用LinkedHashMap一般该值为false。不过在LRU算法实现中我们要设置该参数为true,当构造函数中为true时,我们每次调用get方法时都会调用该方法,将我们访问的Node移动到最后,使之成为尾部节点,从而改变了数据在LinkedHashMap中的存储顺序。
  2. LinkedHashMap中本身就实现了一个方法removeEldestEntry用于判断是否需要移除最不常读取的数,方法默认是直接返回false,不会移除元素,所以需要重写该方法。即当缓存满后就移除最不常用的数。

所以使用LinkedHashMap很简单的实现了LRU算法,代码如下。另外如果生产中使用的话,一定要记得线程安全加锁。

class LRULinkedHashMap extends LinkedHashMap { // 定义缓存的容量 private int capacity; // 带参数的构造器 LRULinkedHashMap(int capacity){ // 第三个参数为accessOrder super(16,0.75f,true); // 传入指定的缓存最大容量 this.capacity=capacity; } // 实现LRU的关键方法,如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素 @Override public boolean removeEldestEntry(Map.Entry eldest){ return size()>capacity; } }

更多内容,欢迎关注微信公众号:全菜工程师小辉~

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

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

相关文章

word List 48

word List 48 如果存在什么问题,欢迎批评指正!谢谢!

一文读懂常用开源许可证

社区时常为流行产品中有争议的开源许可证而感到震惊,这引起各方关注,纷纷争论何为真正的开源许可证。去年,Apache 基金会(Apache Foundation)禁止使用 Facebook React 那些具有争议的专利组件,这引发了轩然…

[蓝桥杯2015初赛]手链样式-思维+next_permutation枚举(好题)

题目描述 小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。 他想用它们串成一圈作为手链,送给女朋友。 现在小明想知道:如果考虑手链可以随意转动或翻转,一共有多少不同的组合样式? 输出 请你输出该整数。不要输出任…

python数组赋值给变量_Python:将数组中的元素导出到变量中 (unpacking)

问题 你需要将数组(list)或元组(tuple)中的元素导出到N个变量中。 解决方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构完全一致。 p (1, 2…

word List 49

word List 49 如果存在什么问题,欢迎批评指正!谢谢!

(四)开源C# WPF控件库《AduSkin – UI》

微信公众号:【Dotnet9的博客】,网站:【Dotnet9】,问题或建议:【请网站留言】, 如果对您有所帮助:【欢迎赞赏】。https://dotnet9.com追求极致,永臻完美A Beautiful WPF Control UI一…

[NOIP2008 提高组] 笨小猴-map容器用来标记

题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出…

python输入数据爬取_python根据用户需求输入想爬取的内容及页数爬取图片方法详解...

本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数。 主要步骤: 1.提示用户输入爬取的内容及页码。 2.根据用户输入,获取网址列表。 3.模拟浏览器向服务器发送请求,获取响应。 4.利用xpath方法找到图片的标签。 5.保存数据。 代码…

word List 50

word List 50 如果存在什么问题,欢迎批评指正!谢谢!

单点突破,击穿阈值,DevOps转型你需要这样做

在上篇文章里,我提到了如何通过对价值流进行分析、拆解关键要素指标,并通过缩减处理时间PT、降低前置时间LT、提高完成&准确的百分比(C&A%),实现企业研发效能10倍速提升。大家点击回看这篇文章《以埃隆马斯克“…

双向dcdc变换器simulink仿真_二极管箝位五电平变换器Simulin仿真

● 本期为二极管箝位五电平变换器的基本Simulink仿真,只包含其SPWM调制。感谢公众号一位好友“一叶知秋”提供Simulink模型并分享。01二极管箝位五电平变换器调制方法传统的变换器存在高的电压变化率和共模电压,且波形谐波含量较大,使得输出滤…

[蓝桥杯2015初赛]生命之树-求树的最大子树权值和

题目描述 在X森林里,上帝创建了生命之树。 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, …

在.NET Core中使用MachineKey

在.NET Core中使用MachineKey在上篇文章中,我介绍了 Cookie是基于 MachineKey生成的, MachineKey决定了 Cookie生成的算法和密钥,并如果使用多台服务器做负载均衡时,必须指定一致的 MachineKey。但在 .NETCore中,官方似…

cg word List 1

cg word List 1 如果存在什么问题,欢迎批评指正!谢谢!

[蓝桥杯2016初赛]剪邮票-dfs+next_permutation(好题)

题目描述 如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连) 比如,下面两张图中,粉红色所示部分就是合格的剪取。 请你计算,一共有多少种不同…

cg word List2

cg word List 2 如果存在什么问题,欢迎批评指正!谢谢!

如何扩展分布式日志组件(Exceptionless)的日志通知?

作者:justmine头条号:大数据与云原生微信公众号:大数据与云原生创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。为了方便阅读,微信公众号已按分类排版,后续的文章…

hadoop hive集群_基于伪分布式Hadoop搭建Hive平台详细教程

一、搭建环境的前提条件环境:Linux系统Hadoop-2.6.0MySQL 5.6apache-hive-2.3.7这里的环境不一定需要和我一样,基本版本差不多都ok的,所需安装包和压缩包自行下载即可。但是注意hive和hadoop都是2.x系列版本的。这里提供一个我下载的hive版本…

[蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举

题目描述 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。 三阶幻方指的是将1~9不重复的填入一个33的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称作九宫格,在小学奥数里有一句非常…

cg word List 3

cg word List 3 如果存在什么问题,欢迎批评指正!谢谢!