LRU(Least Recently Used) 算法简介
最近最久未使用策略,优先淘汰最久未使用的数据,也就是上次被访问时间距离现在最久的数据,这个算法可以保证内存(缓存)中的数据都是热点数据,从而保证了(内存页面)缓存命中率。
算法实现
思想:
根据LRU的算法思想,我们可以使用双向链表作为缓存来存储我们的数据,每当有访问某个数据时,便可以把这个节点从原来的位置删除,并插入到链表头部,这样能够保证链表尾部存储的是最近最久未使用的节点。当节点数超过缓存容量,那就删除尾部的节点。
问题:这样的话时间复杂度会很高,因为我们知道找到链表中某个节点只能有序遍历。这样的话时间复杂度是O(n),这事不能接受的,所以我们可以想办法,比如说使用HashMap来存储所有的节点。这样的话,查找的时候,只需要O(1)时间就可以得到目标节点。然后又因为我们使用的是双向链表,所以可以很方便的删除目标节点,并把左右两边连接起来。
代码:
测试类:
public class LRUTest {
public static void main(String[] args) {
LUR<Integer,Integer> lur = new LUR<>(4);
for (int i =0;i<10;i++){
lur.put(i,i);
}
}
}
实现: