【leetcode】LRU & LFU

什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。而内存的虚拟存储管理,是现在最通用,最成功的方式--

在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息。这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。

然而,有利就有弊,虚拟页式存储管理增加了进程所需的内存空间,却也带来了运行时间变长这一缺点:进程运行过程中,不可避免地要把在外存中存放的一些信息和内存中已有的进行交换,由于外存的低速,这一步骤所花费的时间不可忽略。因而,采取尽量好的算法以减少读取外存的次数,也是相当有意义的事情

--from 360百科

LRU:Least Recently Used

使用代码实现,思路:

借助LinkedHashMap

复制代码
import java.util.*;
class LRUCache {
    private int capacity;
    LinkedHashMap<Integer, Integer> maps = new LinkedHashMap<>();
 
    public LRUCache(int capacity) {
       this.capacity = capacity;
    }
    
    public int get(int key) {
       if(!maps.containsKey(key)){
        return -1;
       }
       makeRecent(key);
       return maps.get(key);
    }
    
    public void put(int key, int value) {
         if(maps.containsKey(key)){
            maps.remove(key);
             maps.put(key, value);
             return;
       }

        if(maps.size() >= capacity){
           removeLast();
        }

       maps.put(key, value);
    
    }

    public void makeRecent(int key){
        int v =  maps.get(key);
        maps.remove(key);
        maps.put(key, v);
    }
    public void removeLast(){
        maps.remove(maps.keySet().iterator().next());
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */

扩展的,对于LFU, 根据使用频次,内存满时淘汰掉

复制代码
     Map<Integer, Node> cache;  // 存储缓存的内容, 从这里返回get
     
    Map<Integer, LinkedHashSet<Node>> freqMap; // 存储每个频次对应的双向链表,
    
    int size;
    int capacity;
    int min; // 存储当前最小频次
相关推荐
IT大白鼠几秒前
CVE-2026-7531 Azure Linux MariaDB PQC 内存破坏漏洞详解
linux·mariadb·azure·cve-2026-7531
敖行客 Allthinker2 分钟前
IM 融合专题:后端架构师的核心修炼
java·开发语言·数据库
凌波粒2 分钟前
LeetCode--53. 最大子序和(贪心算法)
算法·leetcode·贪心算法
无忧.芙桃2 分钟前
线程同步与线程互斥(上)
linux·运维·操作系统·运维开发
Hesionberger10 分钟前
快速求解完全平方数的最少数量
开发语言·数据结构·python·算法·leetcode·c#
HAPPY酷12 分钟前
【ROS2】16G 内存笔记本跑 ROS2 仿真?VMware 虚拟机“保姆级”配置指南 (R9 7940HX + RTX 4060)
java·linux·ide·windows·pycharm
aqiu11111112 分钟前
【算法日记 19】LeetCode 1. 两数之和:梦开始的地方,哈希表的降维打击
算法·leetcode·职场和发展
折哥的程序人生 · 物流技术专研9 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang9 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
donoot10 小时前
Linux系统下图书馆级电子书全自动标准化分类整理完整实施方案
大数据·linux·运维·电子书管理