【算法】LRU最久未使用算法原理分析和编码实战

简介: 【算法】LRU最久未使用算法原理分析和编码实战

什么是LRU算法

  • Least Recently Used 淘汰算法以时间作为参考,淘汰最长时间未被使用的数据
  • 如果数据最近被访问过,那么将来被访问的几率也更高;会淘汰最长时间没有被使用的元素(都没人要你了,不淘汰你淘汰谁)
  • 基本原理是:在缓存满时,将最近最久未使用的数据淘汰出缓存,以便给新的数据留出空间。
  • 实现方式可以用:数组、链表等方式
  • 新插入的数据放在头部,最近访问过的也移到头部,空间满时将尾部元素删除
  • 000173fcc6ad458091b6884f9695e190.png编码实现
public class LRUCache<K,V> {
    //定义存储key的顺序表
    private LinkedList<K> cacheKey;
    //定规存储数据的map 存储key,value
    private HashMap<K,V> cacheValues;
    //定义缓存的容量
    private int capacity;
    //构造方法初始化缓存
    public LRUCache(int capacity) {
        this.cacheKey = new LinkedList<>();
        this.capacity = capacity;
        this.cacheValues = new HashMap<>();
    }
    //向缓存中put元素
    public void put(K key, V value) {
        //先添加元素,无论有没有这个key,直接进行put
        cacheValues.put(key, value);
        cacheKey.add(0, key);
        //判断长度是否超出最大容量,超出进行淘汰
        if (cacheKey.size() > capacity) {
            //如果容量已满,则删除最后一个key
            K lastKey = cacheKey.get(cacheKey.size() - 1);
            cacheKey.remove(lastKey);
            cacheValues.remove(lastKey);
        }
    }
    //获取指定key的元素的value,并且将这个key放置在队头的位置
    public V get(K key) {
        V data = null;
        if (cacheKey.contains(key)) {
            data = cacheValues.get(key);
            cacheKey.remove(key);
            cacheKey.add(0,key);
        }
        return data;
    }
    //
    public void showList(){
        System.out.println(cacheKey.toString());
    }
    public static void main(String[] args) {
        LRUCache<String,String> cache = new LRUCache<>(5);
        cache.put("A", "任务A");
        cache.put("B", "任务B");
        cache.put("C", "任务C");
        cache.put("D", "任务D");
        cache.put("E", "任务E");
        cache.showList();
        System.out.println("G=" + cache.get("G"));
        System.out.println("C=" + cache.get("C"));
        cache.showList();
        cache.put("F", "任务F");
        cache.showList();
    }
}

2c4a839f6ba2436e88e276c0510dd074.png


相关文章
|
30天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
10天前
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解
|
19天前
|
负载均衡 算法 应用服务中间件
5大负载均衡算法及原理,图解易懂!
本文详细介绍负载均衡的5大核心算法:轮询、加权轮询、随机、最少连接和源地址散列,帮助你深入理解分布式架构中的关键技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5大负载均衡算法及原理,图解易懂!
|
23天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
23天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
20 1
|
25天前
|
算法 数据库 索引
HyperLogLog算法的原理是什么
【10月更文挑战第19天】HyperLogLog算法的原理是什么
41 1
|
30天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
11天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
12天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。