LRU和LFU

article/2025/10/16 23:51:40

LRU

根据题意,使用过的数据放在链表的尾部,容量满了就删除链表的头,使用的数据结构是LinkedHashMap
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

146. LRU 缓存(中等)

class LRUCache {private int cap;private LinkedHashMap<Integer, Integer> list;public LRUCache(int capacity) {this.list = new LinkedHashMap<>();this.cap = capacity;}public int get(int key) {//cache中不存在,返回-1if (!list.containsKey(key)) {return -1;}//存在,key变为使用过-放到哈希表末尾makeRencentlyUsed(key);// 将 key 变为最近使⽤return list.get(key);}/* 添加最近使⽤的元素 */public void put(int key, int value) {//存在就更新if (list.containsKey(key)) {list.put(key, value);makeRencentlyUsed(key);//put和get存在的话都要将key提升到最近使用的位置,即链表末尾return;}//判断容量if (this.cap <= list.size()) {int oldKey = list.keySet().iterator().next();list.remove(oldKey);//不满足删除最久没有使用过的数据,即链表头节点}list.put(key, value);}/* 将某个 key 提升为最近使⽤的 */private void makeRencentlyUsed(int key) {int oldValue = list.get(key);list.remove(key);        // 先从链表中删除这个节点list.put(key, oldValue);// 重新插到队尾}
}

LFU

460. LFU 缓存(困难)

class LFUCache {private HashMap<Integer, Integer> keyToValue;private HashMap<Integer, Integer> keyToFreq;private HashMap<Integer, LinkedHashSet<Integer>> freqToKey;private int cap;private int minFreq;public LFUCache(int capacity) {this.keyToValue = new HashMap<>();this.keyToFreq = new HashMap<>();this.freqToKey = new HashMap<>();this.cap = capacity;this.minFreq = 0;}public int get(int key) {if (!keyToValue.containsKey(key)) {return -1;}increaseFreq(key);// 增加 key 对应的 freqreturn keyToValue.get(key);}public void put(int key, int value) {if (this.cap <= 0) return;/* 若 key 已存在,修改对应的 val 即可 */if (keyToValue.containsKey(key)) {keyToValue.put(key, value);// key 对应的 freq 加一increaseFreq(key);return;}/* key 不存在,需要插入 *//* 容量已满的话需要淘汰一个 freq 最小的 key */if (this.cap <= keyToValue.size()) {removeMinFreq(key);}/* 插入 key 和 val,对应的 freq 为 1 */// 插入 KV 表keyToValue.put(key, value);// 插入 KF 表keyToFreq.put(key, 1);// 插入 FK 表freqToKey.putIfAbsent(1, new LinkedHashSet<>());// 插入新 key 后最小的 freq 肯定是 1freqToKey.get(1).add(key);this.minFreq = 1;return;}private void increaseFreq(int key) {int oldValue = keyToFreq.get(key);keyToFreq.put(key, oldValue + 1);        /* 更新 KF 表 *//* 更新 FK 表 */freqToKey.get(oldValue).remove(key);// 将 key 从 freq 对应的列表中删除// 如果 freq 对应的列表空了,移除这个 freqif (freqToKey.get(oldValue).isEmpty()) {freqToKey.remove(oldValue);// 如果这个 freq 恰好是 minFreq,更新 minFreqif (minFreq == oldValue) {minFreq++;}}freqToKey.putIfAbsent(oldValue + 1, new LinkedHashSet<>());// 将 key 加入 freq + 1 对应的列表中freqToKey.get(oldValue + 1).add(key);}private void removeMinFreq(int key) {// freq 最小的 key 列表LinkedHashSet<Integer> list = freqToKey.get(this.minFreq);// 其中最先被插入的那个 key 就是该被淘汰的 keyInteger oldKey = list.iterator().next();/* 更新 FK 表 */list.remove(oldKey);if (list.isEmpty()) {freqToKey.remove(this.minFreq);// 问:这里需要更新 minFreq 的值吗?}keyToValue.remove(oldKey);        /* 更新 KV 表 */keyToFreq.remove(oldKey);       /* 更新 KF 表 */}
}

http://chatgpt.dhexx.cn/article/gQM1sYNs.shtml

相关文章

LFU缓存详解

LFU缓存详解 文章目录 LFU缓存详解一、LFU概念二、分析方法一&#xff1a;哈希表 平衡二叉树方法二&#xff1a;双哈希表 一、LFU概念 LRU详解&#xff1a;https://blog.csdn.net/wolfGuiDao/article/details/105862106 LRU 算法相当于把数据按照时间排序&#xff0c;这个需求…

LRU和LFU算法

LRU淘汰算法 LRU&#xff1a;Least Recently Used&#xff0c;最近最少使用。即淘汰掉最近最少使用的数据。 以时间轴作为走向&#xff1a; 如果数据A刚被访问&#xff0c;那么A就应该调至头部&#xff1a; 假如内存容量已满&#xff0c;现在新数据E被插入&#xff0c;需要淘…

FIFO、LRU、LFU的含义和原理

FIFO&#xff1a;First In First Out&#xff0c;先进先出LRU&#xff1a;Least Recently Used&#xff0c;最近最少使用 LFU&#xff1a;Least Frequently Used&#xff0c;最不经常使用 以上三者都是缓存过期策略。 原理和实现&#xff1a; 一、FIFO按照“先进先出&#…

LFU算法

LFU&#xff08;LeastFrequently Used&#xff09;&#xff0c;即最近最多使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少&#xff0c;那么在将来一段时间内被使用的可能性也很小”的思路。LFU算法需要维护一个队列记录所有数据的访问记录&#xff0c;每个数据…

Redis精通系列——LFU算法详述(Least Frequently Used - 最不经常使用)

本文已收录于专栏 ❤️《Redis精通系列》❤️ 上千人点赞收藏&#xff0c;全套Redis学习资料&#xff0c;大厂必备技能&#xff01; 目录 1、简介 2、实现方式 2.1 LRU实现方式 2.2 LFU实现方式 3、LFU使用 3.1 配置文件开启LFU淘汰算法 1、简介 LRU有一个明显的缺点&…

什么是LRU?什么是LFU

缓存算法是指令的一个明细表&#xff0c;用于决定缓存系统中哪些数据应该被删去。 常见类型包括LFU、LRU、ARC、FIFO、MRU。 最不经常使用算法&#xff08;LFU&#xff09;&#xff1a; 这个缓存算法使用一个计数器来记录条目被访问的频率。通过使用LFU缓存算法&#xff0c;…

LRU算法和LFU算法

文章目录 1、LRU算法2、LFU算法 1、LRU算法 LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c;选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段&#xff0c;用来记录一个页面自上次被访问以来所…

LRU算法与LFU算法

LRU算法 LRU是Least Recently Used的缩写&#xff0c;即最近最少使用算法&#xff0c;是操作系统中页面置换算法的一种&#xff0c;由于内存中存放的页数有限&#xff0c;所以将最近没有使用到的算法会移出内存。 LRU原理&#xff1a; LRU原理如下图所示&#xff1a; 它会将最…

【算法】LFU及其优化

文章目录 什么是LFU&#xff1f;设计思路代码实现&#xff08;基础版本&#xff09;参考论文代码实现&#xff08;优化版本&#xff09;区别 什么是LFU&#xff1f; LRU及其实现 上文讲解了LRU&#xff0c;他是一个基于最近是否被访问来做缓存淘汰的策略。 那么今天介绍一个新…

LRU和LFU算法解析

文章目录 LRU和LFU算法解析LRULRU概念LRU算法实现LRU算法描述LRU算法图示LRU C代码代码测试 LFULFU概念LFU算法实现LFU算法描述LFU算法图示LFU C代码代码测试 总结 LRU和LFU算法解析 LRU LRU概念 LRU&#xff08;The Least Recently Used&#xff0c;最近最少未使用&#xf…

LRU和LFU的区别

对于web开发而言&#xff0c;缓存必不可少&#xff0c;也是提高性能最常用的方式。无论是浏览器缓存(如果是chrome浏览器&#xff0c;可以通过chrome:://cache查看)&#xff0c;还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问&#xff0c;…

LFU算法族:LFU算法

LFU算法族相关文章目录汇总&#xff1a; LFU算法&#xff08;本文&#xff09;​​​​​​​ LFU-Aging算法 window-LFU算法 1、原理 LFU&#xff08;Least Frequently Used&#xff09;算法&#xff0c;即最少访问算法&#xff0c;根据访问缓存的历史频率来淘汰数据&…

LFU算法详解

LFU算法&#xff1a;least frequently used&#xff0c;最近最不经常使用算法 对于每个条目&#xff0c;维护其使用次数 cnt、最近使用时间 time。 cache容量为 n&#xff0c;即最多存储n个条目。 那么当我需要插入新条目并且cache已经满了的时候&#xff0c;需要删除一个之…

算法题就像搭乐高:手把手带你拆解 LFU 算法

f学算法认准labuladong 东哥带你手把手撕力扣???? 点击下方卡片即可搜索???? PS&#xff1a;以后每篇文章最后&#xff0c;labuladong 都会推荐一些自己学过的优质技术专栏&#xff0c;供读者参考。 上篇文章 算法题就像搭乐高&#xff1a;手把手带你拆解 LRU 算法 写了…

LRU LFU 概念、底层原理及其实现 超详细~

0. 前置提要 本篇约为8650字&#xff0c;阅读完需要约40~60分钟。主要介绍页面置换算法,LRU和LFU的原理及其实现&#xff0c;对应leetcode140和460&#xff0c;如果能给个赞就更好了^-^。 1.从内存置换算法说起 计算机的运行的程序和数据保存在内存中&#xff0c;内存的空间是有…

如何实现LFU缓存(最近最少频率使用)

目录 1.什么是LFU缓存&#xff1f; 2.LFU的使用场景有哪些&#xff1f; 3.LFU缓存的实现方式有哪些&#xff1f; 4.put/get 函数实现具体功能 1.什么是LFU缓存&#xff1f; LFU缓存是一个具有指定大小的缓存&#xff0c;随着添加元素的增加&#xff0c;达到容量的上限&…

LFU缓存策略算法

在之前的文章中&#xff0c;我们介绍了如何设计一个LRU算法–如何设计LRU Cache算法&#xff0c;今天我们再聊一聊另一种缓存策略LFU。目前博主个人博客已经搭建发布&#xff0c;后期相关文章也会发布在上面&#xff0c;大家有兴趣可以去上面学习&#xff0c;点击即可前往文青乐…

国内编程学习网站

在本文中&#xff0c;我们介绍了来自两岸三地的编程学习网站&#xff0c;通过它们&#xff0c;不仅可以一窥国内App开发的发展现状&#xff0c;而且这些网站各有特点&#xff0c;无论是主打游戏学习还是视频学习&#xff0c;对于想要自学的开发者而言&#xff0c;都是个好去处。…

如何高效的自学编程

现在的社会对于IT人才的需求越来越大&#xff0c;程序员的薪资水平在各个行业中都算比较高的。所以很多人都想往IT行业发展&#xff0c;已经身处这个行业的人也需要不断的学习新的知识&#xff0c;因为IT行业的技术更新实在是太快了&#xff0c;不像传统行业那样是越老越吃香。…

电脑编程自学(零基础自学编程怎么入门)

电脑编程自学入手:确定编程学习的方向。编程语言有多种:php,C++,C,C#,JAVA,Python等,每种语言都有不同的优缺点,可以根据自己的兴趣方向选择一门编程语言作为自己的学习目标。 基础阶段的语法学习。学习任何一门编程语言,都需要掌握其编程的语法规则,可以通过阅读一…