《算法通关村——缓存机制了解LRU实现》

《算法通关村——缓存机制了解LRU实现》

介绍

LRU是"Least Recently Used"(最近最少使用)的缓存机制,它是一种常用的缓存算法,用于管理缓存中的数据项。LRU缓存机制的基本思想是,当缓存达到其容量限制时,会淘汰最久没有被访问的数据项,以为新的数据项腾出空间。

LRU缓存机制的实现方式通常是通过维护一个数据结构,例如链表或双向链表,来记录数据项的访问顺序。最近访问的数据项会被移到链表的头部(或双向链表的头部),而最久未被访问的数据项则位于链表的尾部。当需要从缓存中淘汰数据项时,就选择尾部的数据项进行淘汰,以确保淘汰最久未被访问的数据。

LRU缓存机制在实际应用中表现出良好的性能,因为它通常能够保留最常被访问的数据项,从而提高缓存命中率。然而,LRU的实现可能需要一定的额外开销,因为需要维护访问顺序的数据结构,而且在某些情况下,可能需要频繁地移动数据项,这可能会导致性能问题。因此,在特定情况下,可以考虑其他缓存淘汰算法,如LFU(Least Frequently Used)或FIFO(First-In, First-Out)等。

当涉及到缓存淘汰算法时,除了LRU,还有其他一些常见的算法,其中包括LFU(Least Frequently Used)和FIFO(First-In, First-Out):

  1. LFU(Least Frequently Used):

    • LFU算法基于数据项被访问的频率来进行缓存淘汰决策。它认为访问频率较低的数据项应该被淘汰,因为它们被认为是不太重要或不太常用的数据。
    • LFU算法通常使用一个计数器来跟踪每个数据项被访问的次数。当需要淘汰数据项时,选择具有最低访问次数的数据项进行淘汰。
    • 一些变种的LFU算法也考虑了时间因素,以便更好地适应数据访问模式的变化。这些变种可能会在计数器的基础上引入时间衰减因素。
  2. FIFO(First-In, First-Out):

    • FIFO算法是一种非常简单的缓存淘汰策略。它按照数据项最早进入缓存的顺序来进行淘汰。也就是说,首先进入缓存的数据项最先被淘汰,而最后进入的数据项最后被淘汰。
    • FIFO算法通常使用一个队列来维护数据项的顺序。当需要淘汰数据项时,从队列的头部移除最早进入的数据项。
    • FIFO算法的主要优点是其简单性,但它可能不太适用于某些访问模式,因为它不考虑数据项的访问频率或重要性,只根据进入顺序进行淘汰。

选择何种缓存淘汰算法通常取决于具体的应用场景和需求。不同的算法有不同的优缺点,因此需要根据数据访问模式、性能需求以及实际应用的特点来选择最合适的算法。在某些情况下,也可以考虑结合多个算法或自定义淘汰策略以满足特定的需求。

代码实现

package AlgorithmFifth;import java.util.HashMap;
import java.util.Map;public class LRUCache {class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {}public DLinkedNode(int _key,int _value){key = _key;value = _value;}}private Map<Integer,DLinkedNode> cache = new HashMap<>();private int size;private int capacity;private DLinkedNode head,tail;public LRUCache(int capacity){this.size = 0;this.capacity = capacity;// 使用伪头部和伪尾部节点head = new DLinkedNode();tail = new DLinkedNode();head.next = tail;tail.prev = head;}public int get(int key){DLinkedNode node = cache.get(key);if(node == null){return -1;}// 如果key存在,先通过哈希表定位,再移到头部moveToHead(node);return node.value;}public void put(int key,int value){DLinkedNode node = cache.get(key);if(node == null){// 如果key不存在创建一个新节点DLinkedNode newNode = new DLinkedNode(key,value);// 添加进哈希表cache.put(key,newNode);// 添加至双向链表的头部addToHead(newNode);++size;if(size > capacity){// 如果超出容量,删除双向链表的尾部节点DLinkedNode tail = removeTail();// 删除哈希表中对应的项cache.remove(tail.key);size--;}}else {// 如果key存在,先通过哈希表定位,在修改value,并移到头部node.value = value;moveToHead(node);}}private void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}private void removeNode(DLinkedNode node){node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(DLinkedNode node){removeNode(node);addToHead(node);}private DLinkedNode removeTail(){DLinkedNode res = tail.prev;removeNode(res);return res;}public static void main(String[] args) {LRUCache lruCache = new LRUCache(2);lruCache.put(1,1);lruCache.put(2,2);System.out.println(lruCache.get(1));lruCache.put(3,3);System.out.println(lruCache.get(2));lruCache.put(4,4);System.out.println(lruCache.get(1));System.out.println(lruCache.get(3));System.out.println(lruCache.get(4));}
}

近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

在这里插入图片描述

也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

也可以加我QQ(2837468248)咨询说明来意!

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

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

相关文章

【Tricks】PC端微信输入时,文本出现右对齐情况怎么恢复

应该是摁到某个快捷键&#xff0c;于是光标就变成如下图所示的样子&#xff1a; 如果再输入字符&#xff0c;则字符就会变成下图所示的样子&#xff08;对齐输入框右侧&#xff09;&#xff1a; 解决办法&#xff1a;ctrl J 解决办法&#xff1a;ctrl J 解决办法&#xff1…

5.2 用户数据报协议UDP

思维导图&#xff1a; 课程笔记&#xff1a;5.2 用户数据报协议UDP 5.2.1 UDP概述 一、UDP基本概念 无连接协议&#xff1a;UDP是一个简单的面向数据报的传输层协议&#xff0c;不需要在数据传输前建立连接&#xff0c;故减少开销和延迟。复用/分用&#xff1a;UDP允许多个应…

我的ChatGPT的几个使用场景

示例一&#xff0c;工作辅助、写函数代码&#xff1a; 这里展示了一个完整的代码&#xff0c;修正&#xff0c;然后最终输出的过程。GPT具备足够丰富的相关的小型代码生成能力&#xff0c;语法能力也足够好。这类应用场景&#xff0c;在我的GPT使用中&#xff0c;能占到65%以上…

Spring Boot 使用断言抛出自定义异常,优化异常处理机制

文章目录 什么是断言&#xff1f;什么是异常&#xff1f;基于断言实现的异常处理机制创建自定义异常类创建全局异常处理器创建自定义断言类创建响应码类创建工具类测试效果 什么是断言&#xff1f; 实际上&#xff0c;断言&#xff08;Assertion&#xff09;是在Java 1.4 版本…

docker解决oracle中ORA-12514和ORA-03113问题

ORA-12514&#xff1a;TNS&#xff1a;监听程序当前无法识别连接描述符中请求的服务; 1、进入docke容器 docker exec -it 容器id bash 2、找到并修改listener.ora文件 查看oracle的位置 命令&#xff1a;cat /etc/profile 这是listener.ora文件的位置 /home/oracle/app/oracl…

JVM虚拟机:你是如何理解Java中的垃圾?

什么是垃圾&#xff1f; 垃圾就是内存中不再被使用到的空间&#xff0c;当一个对象不再被引用后那么久成为垃圾可以回收了&#xff0c;但是线程计算没有引用也可以独立运行&#xff0c;因此线程和对象不同。如果一个对象没有任何一个引用指向它了&#xff0c;那么这个对象就是…

【机器学习】五、贝叶斯分类

我想说&#xff1a;“任何事件都是条件概率。”为什么呢&#xff1f;因为我认为&#xff0c;任何事件的发生都不是完全偶然的&#xff0c;它都会以其他事件的发生为基础。换句话说&#xff0c;条件概率就是在其他事件发生的基础上&#xff0c;某事件发生的概率。 条件概率是朴…

【c++|opencv】二、灰度变换和空间滤波---3.均值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 均值滤波 1. 均值滤波 #include <iostream> #include <opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using names…

【Linux】vim 使用

目录 一&#xff0c;vim 与 vi 1&#xff0c;vim 的基本概念 二&#xff0c;vim 的基本操作 三&#xff0c;vim 正常模式命令集 1&#xff0c;插入模式 2&#xff0c;从插入模式或者底行模式切换为命令模式 3&#xff0c;移动光标 4&#xff0c;删除文字 5&#xff0…

grid布局中grid-row和grid-column

目录 一、grid-row 二、grid-column 三、实例 一、grid-row grid-row属性定义了网格元素行的开始和结束位置。结合了grid-row-start和grid-row-end grid-row: 1 / 3;//表示行线从第一行线到第三行线为止 二、grid-column grid-column属性定义了网格元素列的开始和结束位置…

《YOLOv8-Pose关键点检测》专栏介绍 CSDN独家改进创新实战 专栏目录

YOLOv8-Pose关键点检测专栏介绍&#xff1a;http://t.csdnimg.cn/gRW1b ✨✨✨手把手教你从数据标记到生成适合Yolov8-pose的yolo数据集&#xff1b; &#x1f680;&#x1f680;&#x1f680;模型性能提升、pose模式部署能力&#xff1b; &#x1f349;&#x1f349;&#…

LeetCode----84. 柱状图中最大的矩形

题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10 示例 2: 输入: heights =…

tolua中table.remove怎么删除表中符合条件的数据

tolua中table.remove怎么删除表中符合条件的数据 介绍问题&#xff08;错误方式删除数据&#xff09;正确删除方案从后向前删除递归方式删除插入新表方式 拓展一下总结 介绍 在lua中删除表中符合条件的数据其实很简单&#xff0c;但是有一个顺序问题&#xff0c;因为lua的表中…

【机器学习】四、计算学习理论

1 基础知识 计算学习理论&#xff08;computational learning theory&#xff09;&#xff1a;关于通过“计算”来进行“学习”的理论&#xff0c;即关于机器学习的理论基础&#xff0c;其目的是分析学习任务的困难本质&#xff0c;为学习算法体统理论保证&#xff0c;并根据结…

网络质量探测

目录 一.BFD监测网络状态 二. NQA检测网络状态 一.BFD监测网络状态 BFD(BidrectionaL Forwarding Detection 双向转发检测)用于快速检测系统设备之间的发送和接受两个方向的通信故障&#xff0c;并在出现故障时通知生成应用。BFD 广泛用于链路故障检测&#xff0c;并能实现与…

基于深度学习的口罩佩戴检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、基于深度学习的口罩佩戴检测四. 总结 一项目简介 基于深度学习的口罩佩戴检测是一种利用计算机视觉技术和深度学习算法进行口罩佩戴情况检测的…

计算机毕业设计选题推荐-校园失物招领微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)

大纲 mapreduce完整代码参考资料 在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》一文中&#xff0c;我们发现如果窗口内元素个数没有达到窗口大小时&#xff0c;计算个数的函数是不会被调用的。如下图中红色部分 那么有没有办法让上图中&#xff08;B,2&…

人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047

这个不分也是挺难的,但是之前有详细的,解释了,之前的文章中有, 那么这里会简单提一下,然后,继续向下学习 首先我们要知道高斯分布,也就是,正太分布, 这个可以预测x在多少的时候,概率最大 要知道在概率分布这个,高斯分布公式中,u代表平均值,然后西格玛代表标准差,知道了 这两个…