LRU原理简介
LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
LRU 算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
比如:计算机为每个进程分配三块可用物理内存,现在数据为0,1,2,3,4。所以不可能把这5个数据都放在物理内存之中,每个数据的使用权重也是不一样的。比如数据使用顺序为1,3,4,1,2,0,4,2。假如一开始三块内存块都为空,我们来模拟一下LRU算法的过程:
这就是LRU算法的基本原理,那我们应该怎么实现LRU算法呢?
LRU算法实现
1.首先要保证数据可以随时取用,比如内存块中的数据为1,3,2.取1,3,2的复杂度都应该为O(1),并且需要取中间数进行刷新到头部,这很符合散列表的特性。所以我们会利用Java中的HashMap进行数据的存储获取
2.数据应该是有序的,我需要保证每次插入头节点的数据是最新的,去除尾部的历史数据。这种头尾更新数据的操作用数据需要频繁移动数据,所以需要用链表。当更新中间数据时需要链接前后链表,删除尾部时需要更新尾部指针到它上一个指针的位置,所以双向链表更方便这种操作。
3.用队列实现这种先后顺序行吗?不可以,因为需要查找到中间已存在的元素更新到头部。
1.准备一个双向链表数据结构
1 | class DoubleLinkedNode { |
对于一个LRU算法实现,需要至少两个操作:
get(key),set(key,value)
当get(key)的时候,如果key不存在,返回-1,若key存在,刷新对应的数据到链表头部
put(key,value) ,如果key存在,获取对应的值并刷新到头部。如果不存在,存储值到头部,若存储的数量已超出最大值,则去掉尾部的节点并移除掉map中的数据。
LRU实现
具体的实现如下:
1 | import java.util.HashMap; |
LRU算法在很多框架中有很对应的实现或者变种实现,目前就介绍到这里.