一分钟学习LRU和LFU

news/2024/7/25 21:08:32/文章来源:https://blog.csdn.net/weixin_61281255/article/details/139157248

使用 JavaScript 实现 LFU(最少使用)和 LRU(最近最少使用)缓存策略,可以帮助你理解这两种算法的工作原理。下面是这两种缓存策略的实现示例。

总结

LRU(Least Recently Used)

LRU(最近最少使用)缓存算法基于最近使用的原则来管理缓存。以下是一个示例说明如何在 LRU 缓存中插入和访问元素:

假设给你一个数组,最大容量是 6:

  • 当前数组状态:[1, 2, 3, 4, 5]
  • 插入元素 6,数组变为:[1, 2, 3, 4, 5, 6]
  • 使用元素 2,数组变为:[1, 3, 4, 5, 6, 2](2 被移动到数组末尾,因为它是最近使用的)
  • 插入元素 7,数组已经达到最大容量,需要淘汰最久未使用的元素(1)
  • 删除元素 1,数组变为:[3, 4, 5, 6, 2, 7]

LFU(Least Frequently Used)

LFU(最少使用)缓存算法基于使用频率来管理缓存。以下是一个示例说明如何在 LFU 缓存中插入和访问元素:

假设给你一个数组,最大容量是 6:

  • 当前数组状态:[1, 2, 3, 4, 5](每个元素的使用频率为 1)
  • 插入元素 6,数组变为:[1, 2, 3, 4, 5, 6]
  • 使用元素 2,数组状态和使用频率变为:[(1,1), (2,2), (3,1), (4,1), (5,1), (6,1)](2 的使用频率增加到 2)
  • 再次使用元素 2,数组状态和使用频率变为:[(1,1), (2,3), (3,1), (4,1), (5,1), (6,1)](2 的使用频率增加到 3)
  • 插入元素 7,数组已经达到最大容量,需要淘汰使用频率最小的元素(使用频率为 1 的元素)
  • 删除使用频率为 1 的元素(1、3、4、5 或 6),假设删除元素 1,数组变为:[(2,3), (3,1), (4,1), (5,1), (6,1), (7,1)]

这样,LFU 算法可以确保淘汰那些使用频率最低的元素,优先保留使用频率较高的元素。

总结

  • LRU 算法:基于最近使用的原则管理缓存,最久未使用的元素会被淘汰。适用于需要快速访问最近使用过的元素的场景。
  • LFU 算法:基于使用频率管理缓存,使用频率最低的元素会被淘汰。适用于需要根据元素使用频率决定缓存策略的场景。

实现 LRU 缓存策略

LRU 缓存可以通过结合 MapDoubly Linked List 实现。以下是一个 LRU 缓存的简单实现:

class LRUCache {constructor(capacity) {this.capacity = capacity;this.cache = new Map();}get(key) {if (!this.cache.has(key)) {return -1;}const value = this.cache.get(key);this.cache.delete(key);this.cache.set(key, value);return value;}put(key, value) {if (this.cache.has(key)) {this.cache.delete(key);}this.cache.set(key, value);if (this.cache.size > this.capacity) {this.cache.delete(this.cache.keys().next().value);// delete the first key}}
}// 测试 LRUCache
const lruCache = new LRUCache(3);
lruCache.put(1, 1);
lruCache.put(2, 2);
lruCache.put(3, 3);
console.log(lruCache.get(1)); // 1
lruCache.put(4, 4);
console.log(lruCache.get(2)); // -1 (因为 key 2 已被淘汰)
lruCache.put(5, 5);
console.log(lruCache.get(3)); // -1 (因为 key 3 已被淘汰)
console.log(lruCache.get(4)); // 4
console.log(lruCache.get(5)); // 5

实现 LFU 缓存策略

LFU 缓存相对复杂一些,需要维护每个缓存项的使用频率。我们可以使用一个 Map 来存储缓存项和它们的使用频率,再使用另一个 Map 来存储每个频率对应的缓存项集合。

class LFUCache {constructor(capacity) {this.capacity = capacity;this.cache = new Map();this.freqMap = new Map();}get(key) {if (!this.cache.has(key)) {return -1;}const value = this.cache.get(key);const freq = this.freqMap.get(key) || 0;this.freqMap.set(key, freq + 1);return value;}put(key, value) {if (this.cache.size >= this.capacity) {let minFreq = Infinity;let minKey;for (let [k, freq] of this.freqMap) {if (freq < minFreq) {minFreq = freq;minKey = k;}}this.cache.delete(minKey);this.freqMap.delete(minKey);}this.cache.set(key, value);this.freqMap.set(key, (this.freqMap.get(key) || 0) + 1);}
}const lfuCache = new LFUCache(3);
lfuCache.put(1, 1);
lfuCache.put(2, 2);
lfuCache.put(3, 3);
console.log(lfuCache.get(1)); // 1
lfuCache.put(4, 4);
console.log(lfuCache.get(2)); // -1 (因为 key 2 已被淘汰)
lfuCache.put(5, 5);
console.log(lfuCache.get(3)); // -1 (因为 key 3 已被淘汰)
console.log(lfuCache.get(4)); // 4
console.log(lfuCache.get(5)); // 5

总结

  • LRU 缓存策略:根据最近使用的情况来淘汰最久未使用的项。通过 Map 结合 Doubly Linked List 实现。
  • LFU 缓存策略:根据使用频率来淘汰最少使用的项。通过两个 Map 实现,一个存储缓存项和它们的使用频率,另一个存储每个频率对应的缓存项集合。

以上示例提供了这两种缓存策略的基本实现,可以根据具体需求进行扩展和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1052158.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器软件架构演进

服务器软件架构演进 背景介绍阶段一&#xff1a;单机部署阶段二&#xff1a;应用与数据分离部署阶段三&#xff1a;启用缓存优化阶段四&#xff1a;启用应用服务器集群阶段五&#xff1a;数据库读写分离阶段六&#xff1a;启用反向代理及CDN加速阶段七&#xff1a;启用分布式文…

探索亚马逊云科技技术课程:大模型平台与提示工程的应用与优化

上方图片源自亚马逊云科技【生成式 AI 精英速成计划】技术开发技能课程 前言 学习了亚马逊云科技–技术开发技能课程 本课程分为三个部分&#xff0c;了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发&#xff0c;了解各类服务的优势、功能、典型使用案…

【简单介绍下容器是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

专为汽车内容打造的智能剪辑解决方案

汽车内容创作已成为越来越多车主和汽车爱好者热衷的活动。然而&#xff0c;如何高效、便捷地将行车途中的精彩瞬间转化为高质量的视频作品&#xff0c;一直是困扰着广大用户的一大难题。美摄科技凭借其深厚的视频处理技术和智能分析能力&#xff0c;推出了专为汽车内容记录而生…

斯洛文尼亚普利雅玛城堡:吉尼斯世界纪录认证的世界最大溶洞城堡

除了著名的波斯托伊纳溶洞&#xff08;Postojna Cave&#xff09;&#xff0c;普利雅玛城堡&#xff08;Predjama Castle&#xff09;也是波斯托伊纳洞穴公园&#xff08;Postojna Cave Park&#xff09;不容错过的景点之一。这座城堡坐落在斯洛文尼亚&#xff08;Slovenia&…

Java入门基础学习笔记47——ArrayList

什么是集合呢&#xff1f; 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似数组。 有数组&#xff0c;为什么还要学习集合呢&#xff1f; 数组定义完成并启动后&#xff0c;长度就固定了。 而集合是大小可变&#xff0c;开发中用的最多的。 集合的特点&#xff1a;大…

基于docxtpl的模板生成Word

docxtpl是一个用于生成Microsoft Word文档的模板引擎库。它结合了docx模块和Jinja2模板引擎&#xff0c;使用户能够使用Microsoft Word模板文件并在其中填充动态数据。这个库提供了一种方便的方式来生成个性化的Word文档&#xff0c;并支持条件语句、循环语句和变量等控制结构&…

从零开始构建 Vision Transformer(ViT) 模型

Transformer 模型最早由 Vaswani 等人在 2017 年论文 Attention Is All You Need 中提出&#xff0c;并已广泛应用于自然语言处理。 2021年&#xff0c;Dosovitsky 等人在论文An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale中提出将 Transforme…

PyQt5-新手避坑指南(持续更新)

文章目录 一&#xff0e;前言二&#xff0e;开发环境三&#xff0e;坑1.程序没有详细报错就退出了2.qrc资源文件的使用3.QLabel文字自动换行4.图片自适应大小5.checkbox自定义样式后✓不见了6.多线程 四&#xff0e;记录 一&#xff0e;前言 本篇博客整理了一些初学者容易犯的…

211大学计算机专业不考408,新增的交叉专业却考408!南京农业大学计算机考研考情分析!

南京农业大学信息科技学院可追溯至1981年成立的计算中心和1985年筹建的农业图书情报专业。1987年设立了农业图书情报系&#xff0c;1993 年农业图书情报系更名为信息管理系&#xff0c;本科专业名称也于1999年更名为信息管理与信息系统专业。1994年计算中心开始招收计算机应用专…

YOLOv10来了

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 前言 YOLOv10 由清华大学研究人员在 Ultralytics版基础上进行进一步开发&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了以前版本 YOLO 在后处理和模型架构方面的不足。通过消除非最大…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;英码科技凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒…

探索循环逻辑:for逻辑分支与容器遍历的深度剖析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;for逻辑与循环体的奥秘 二、for逻辑与循环体的结合使用 1. 函数与循环…

数字水印 | 离散余弦变换 DCT 基本原理及 Python 代码实现

目录 1 基本原理2 代码实现3 图像压缩 1 基本原理 参考博客&#xff1a;https://www.cnblogs.com/zxporz/p/16072580.html D C T \mathsf{DCT} DCT 全称为 D i s c r e t e C o s i n e T r a n s f o r m \mathsf{Discrete\ Cosine\ Transform} Discrete Cosine Transfo…

Git远程控制

文章目录 1. 创建仓库1.1 Readme1.2 Issue1.3 Pull request 2. 远程仓库克隆3. 推送远程仓库4. 拉取远程仓库5. 配置Git.gitignore配置别名 使用GitHub可以&#xff0c;采用Gitee也行 1. 创建仓库 1.1 Readme Readme文件相当于这个仓库的说明书&#xff0c;gitee会初始化2两份…

字符串的周期:每一期都有那么几位

【题目描述】 如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例 如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。 输入一个长度不超过80的字符串(不含空格),输出其最小周期。 输入第一行表示有T组数据,后续是T行字符串。输出的每组…

打印机里失败的任务删不掉的解决办法 斑马打印机更新电脑驱动和升级打印机固件 提示ribbon out 并黄状态亮+黄供应闪

强删打印任务 WinR services.msc 停止服务 Print spooler C:\Windows\System32\spool\PRINTERS 清空文件夹下所有文件 详细 要删除打印机里失败的任务&#xff0c;可以按照以下步骤操作&#xff1a; 停止打印服务&#xff1a;您需要停止Windows系统中的“Print Spooler”服…

期货学习笔记-斐波那契学习1

斐波那契数列介绍 斐波那契数列是1、1、2、3、5、8、13、21、34、55、89…据说这是数学家莱昂纳多 斐波那契研究兔子繁殖时发现的一个神奇数列&#xff0c;似乎大自然在按照这个数列进行演化&#xff0c;一个斐波那契数字是由该数列相邻的前两个数字相加得到的 在斐波那契交易…

亚马逊云主管马特·加尔曼面临压力,致力于在人工智能领域赶超竞争对手

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…