LRU(least recent used)算法,指的是最近最少访问淘汰算法,是内存不够的场景下,淘汰旧内容的策略。当内存中发生缺页异常的时候,需要从磁盘中读出最新的一页,那原来的一段时间内最少被访问的那一页就需要被替换掉。如何自己实现一个LRU队列,给定队列的容量,使之在常数时间内就能实现插入新的一页,删除最少访问的一页等操作呢?

我们用基于hashmap和双向链表的方法:

如上图所示:head和tail表示双向链表的头和尾部,LRU队列就是头尾之间的双向链表。我们定义了一个hash表,存放不同的key值对应的链表节点的地址。这样通过key就可以以常数的时间来访问到链表头,找到有没有这个节点了。如果hashmap里面的容量少于标定容量,在访问时,首先寻找存不存在当前节点,如果存在就只是修改值,不存在则插入,注意之后需要把这个节点放在队首表示最近访问;如果已经超出容量了,可以先插入,然后在删除尾结点(最近最少访问到)。

java代码如下:

class DLinkedNode {String key;int value;DLinkedNode pre;DLinkedNode post;
}
public class LRUCache {private Hashtable<Integer, DLinkedNode>cache = new Hashtable<Integer, DLinkedNode>();private int count;private int capacity;private DLinkedNode head, tail;public LRUCache(int capacity) {this.count = 0;this.capacity = capacity;head = new DLinkedNode();head.pre = null;tail = new DLinkedNode();tail.post = null;head.post = tail;tail.pre = head;}public int get(String key) {DLinkedNode node = cache.get(key);if(node == null){return -1; // should raise exception here.}// move the accessed node to the head;this.moveToHead(node);return node.value;}public void set(String key, int value) {DLinkedNode node = cache.get(key);if(node == null){DLinkedNode newNode = new DLinkedNode();newNode.key = key;newNode.value = value;this.cache.put(key, newNode);this.addNode(newNode);++count;if(count > capacity){// pop the tailDLinkedNode tail = this.popTail();this.cache.remove(tail.key);--count;}}else{// update the value.node.value = value;this.moveToHead(node);}}/*** Always add the new node right after head;*/private void addNode(DLinkedNode node){node.pre = head;node.post = head.post;head.post.pre = node;head.post = node;}/*** Remove an existing node from the linked list.*/private void removeNode(DLinkedNode node){DLinkedNode pre = node.pre;DLinkedNode post = node.post;pre.post = post;post.pre = pre;}/*** Move certain node in between to the head.*/private void moveToHead(DLinkedNode node){this.removeNode(node);this.addNode(node);}// pop the current tail.private DLinkedNode popTail(){DLinkedNode res = tail.pre;this.removeNode(res);return res;}
}

比如一个限定容量为3的LRU,进行下面的操作,示意图如下:

save("key1", 7)

save("key2", 0)

save("key3", 1)

save("key4", 2)

get("key2")

save("key5", 3)

get("key2")

save("key6", 4)

相应的 LRU 双向链表部分变化如下:

缓存淘汰算法 LRU相关推荐

  1. mysql缓存淘汰机制_聊聊缓存淘汰算法-LRU 实现原理

    前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘 ...

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

    缓存淘汰算法--LRU算法 参考: https://www.cnblogs.com/dailidong/p/7571178.html https://blog.csdn.net/wangxilong1 ...

  3. 缓存淘汰算法——LRU算法详细总结及代码实现

    什么是LRU算法? LRU是一种缓存淘汰策略,对于我们的计算机来说,缓存容量是有限的,那么当缓存满了要怎么办?这时就要用到LRU,对于很久没有用过的数据,我们可以将其判定为无用的数据,当新资源进入缓存 ...

  4. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」

    作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...

  5. 看动画理解「链表」实现LRU缓存淘汰算法

    前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...

  6. 算法必知 --- LRU缓存淘汰算法

    作者:_code_x 链接:https://www.jianshu.com/p/b7fed77324b9 写在前 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾 ...

  7. 数据结构与算法 / LRU 缓存淘汰算法

    一.诞生原因 缓存是一种提供数据读取性能的技术,在硬件设计.软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等.但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即: ...

  8. 06 | 链表(上):如何实现LRU缓存淘汰算法?

    缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...

  9. leetcode刷题:LRU缓存淘汰算法

    题目: 分析: 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用.那么, ...

最新文章

  1. 又要头秃?2020年七大AI编程语言大盘点
  2. R:关系型数据库管理
  3. Opengl-光照章节学习成果
  4. APP专项测试关注点介绍
  5. C语言中三块“难啃的硬骨头”
  6. (四)比特币时间序列数据的AI预测
  7. linux:如何修改用户的密码
  8. 【Python实例第4讲】填补缺失值
  9. IPX/SPX 协议
  10. 截止失真放大电路_技术分享:音频功放失真及常见改善方法
  11. iOS使用电脑Safari浏览器查看真机h5网页元素
  12. Python学习笔录(四)--- 数据结构
  13. C++——素数(质数)专题训练
  14. UVa 1595-对称轴
  15. 【莹伙丛】javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringAppl
  16. 软考的高级职称系统架构设计师值得花时间投入吗?
  17. Mysql全套看这一篇就够了特别详细
  18. 耦合天线测试软件,天线间耦合度自动测试系统设计.PDF
  19. php判断几维数组的方法,php判断是几维数组
  20. python实现模式_设计模式-python实现

热门文章

  1. python初学者怎么入门-python初学者怎么入门
  2. python编程语言-python编程语言基础知识总结
  3. python画柱状图-Python 使用 matplotlib 画柱状图教程
  4. 如何利用Matlab完成数字1-9的语音识别
  5. 智能语音识别转文字字幕实时上屏直播系统
  6. 离线语音控制并不等于本地语音识别
  7. css浮动层被遮盖,兼容主流浏览器的背景遮盖和居中浮动层的CSS样式
  8. Python笔记:变量的作用域
  9. ffmbc——为广播电视以及专业用途量身定制的FFmpeg
  10. C++发送HTTP请求获取网页HTML代码