算法:LRU(最近最少使用)

本文参考自小灰文章:https://mp.weixin.qq.com/s/B5xiVeW22ZumbI9KfrYJSg

LRU算法

什么是LRU算法

  LRU算法又称最近最少使用算法,它的基本思想是长期不被使用的数据,在未来被用到的几率也不大,所以当新的数据进来时我们可以优先把这些数据替换掉

  在LRU算法中,使用了一种有趣的数据结构,称为哈希链表。我们知道哈希表是由多个<Key,Value>对组成的,哈希链表是将这写节点链接起来,每一个节点都有一个前驱结点和后驱节点,就像双向链表中的节点一样。哈希表拥有了固定的排列顺序。

  

  基于哈希链表的有序性,我们就可以把<Key,Value>按照最后的使用时间来排列。

LRU算法的基本思路

  假设我们使用哈希链表来缓存用户信息,目前缓存了4个用户,用户按照时间顺序从链表右端插入:

  

  情景一:当访问用户5时,由于哈希链表中没有用户5的数据,从数据库中读取出来插入到缓存中

  

  情景二:挡访问用户2时,由于哈希链表中有用户2的数据,我们把它掐断,放到链表最右段

  

  

  情景三:同情景二,这次访问用户4的数据

  

  情景四:当用户访问用户6,用户6在缓存中没有,需要插入到链表中,但此时链表长度已满,我们把最左端的用户删掉,然后插入用户6

  

说明:我们仔细回顾一下,当缓存命中时,我们就把它放到最右端,也就是说排在右边的是最近被使用过的,那左边的当然是相对较少被访问过的,所以当缓存不命中的时候,我们就把最左边的剔除掉,所以这里就体现了最近最少使用的原则。

LRU算法的基本实现

public class LRUCache{
private int limit;
private HashMap<String,Node> hashMap;
private Node head;
private Node end; public LRUCache(int limit)
{
this.limit = limit;
hashMap = new HashMap<String,Node>();
} public String get(String key){
Node node = hashMap.get(key);
if(node ==null)
return null;
refreshNode(node);
return node.value;
} public void put(String key,String value){
Node node = hashMap.get(key);
if(node == null){
if(hashMap.size()>=limit)
{
String oldKey = removeNode(head);
hashMap.remove(oldKey);
}
node = new Node(key,value);
addNode(node);
hashMap.put(key,node)
}else{
node.value = value;
refreshNode(node);
}
} public void remove(String key){
Node node = hashMap.get(key);
removeNode(node);
hashMap.remove(key);
} /**
* 刷新刚被访问的节点位置
*/
private void refreshNode(Node node)
{
if(node == end)
return;
removeNode(node);
addNode(node);
} /**
* 删除节点
*/ public String removeNode(Node node){
if(node == end)
//删除尾节点
end = end.pre;
else if(node ==head)
//删除头节点
head = head.next;
else
{
//移除中间节点
node.pre.next = node.next;
node.next.pre = node.pre;
}
return node.key;
} /**
* 尾部插入节点
*/ public void addNode(Node node)
{
if(end!=null)
{
end.next = node;
node.pre = end;
node.next = null;
}
end = node;
if(head == null)
head = node;
} }

算法:LRU(最近最少使用)的更多相关文章

  1. LRU算法 - LRU Cache

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

  2. LRU最近最少使用算法

    最近最少使用算法有两种实现方式: (1)记时法:对于每一页增设一个访问时间计时器.每当一个页面被访问时,当时的绝对时钟内容被复制到对应的访问时间计时器中.这样系统就记录了内存中所有页面最后一次被访问的 ...

  3. LRU(最近最少使用淘汰算法)基本实现

     LRU(Least Recently Used) 出发点:在页式存储管理中,如果一页很长时间未被访问,则它在最近一段时间内也不会被访问,即时间局部性,那我们就把它调出(置换出)内存. 为了实现LRU ...

  4. 缓存淘汰算法--LRU算法

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

  5. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  6. 缓存算法–LRU

    LRU LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据.而往往最常读取的,也是读取次数最多的,所 ...

  7. 缓存淘汰算法---LRU

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

  8. 缓存淘汰算法---LRU转

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

  9. [收藏]:[算法]LRU和LFU的区别

    LRU和LFU是不同的! LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面! LFU是最近最不常用页面置换算法(Least Freque ...

  10. 淘汰算法 LRU、LFU和FIFO

    含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Least Frequently Used,最不经常使用 以上三者 ...

随机推荐

  1. Java 中 byte 类型初始化问题

    很早的时候由于工作需要,接触过一点 Java,于是有了这个坑,今天回头看到自己在 Stackoverflow 上提的问题发现了它,于是再记录下. 在使用中,需要将 byte 类型的的每一位都置 1.我 ...

  2. 利用FFmpeg切割视频

    关键词:FFmpeg,seek,ss,t,to,搜索,定位 介绍 如果你想要从输入文件中切割一部分,需要用到ss选项. 快速定位 需要将ss放在输入文件的前面(即-i的前面) elesos1.jpg ...

  3. 【python】计算器

    from __future__ import division import sys from math import * from PyQt4.QtCore import * from PyQt4. ...

  4. Material design之Compatibility(适配)

    Compatibility,为Android L版本和旧版本进行适配设置. 一:Material Theme适配 因为Material Theme只能在Android L的版本中使用,所以为了应用能在 ...

  5. boost数据结构variant

    variant和any有些类似,是一种可变类型,是对C/C++中union概念的增强和扩展:    普通的union只能持有普通数据类型,而不能持有string.vector等复杂类型,而varian ...

  6. 关于sqlSessionTemplate

    SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTempla ...

  7. POJO应用框架:Spring与EJB3.0的比较

    英文原文地址:http://www.onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html中文地址:http://www.matrix.org.cn/r ...

  8. Codeforces Round #207 (Div. 1) B (gcd的巧妙运用)

    比赛的时候不知道怎么写... 太弱了. 看了别人的代码,觉得这个是个经典的知识点吧. gcd的巧妙运用 自己想的时候苦苦思考怎么用dp求解. 无奈字符串太长而想不出好的算法. 其实在把a和b字符串都分 ...

  9. sql查询用nolock

    大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的. 什么是并发访问:同一时间有多个用户访问同一资源,并发 ...

  10. 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈

    [BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...