LRU算法介绍,LRU算法是什么

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。

公众号:一点sir,关注领取编程资料

LRU算法简介

LRU(Least Recently Used)算法是一种常用的缓存替换策略,用于在缓存空间有限的情况下,决定哪些数据应该保留在缓存中,哪些应该被替换掉。LRU算法的核心思想是:如果数据最近被访问过,那么将来被访问的几率也更高。因此,当缓存满时,应该替换掉最长时间未被使用的数据。

LRU算法的实现

LRU算法通常可以通过一个哈希表(用于快速定位缓存项)和一个双向链表(用于记录访问顺序)来实现。当缓存操作发生时,LRU算法的行为如下:

  1. 访问缓存:如果数据在缓存中,更新该数据在双向链表中的位置,将其移动到链表的头部(表示最近被访问)。

  2. 缓存未命中:如果数据不在缓存中,则从主存或其他存储中加载数据,并将其放入缓存链表的头部。

  3. 替换数据:当缓存满时,移除双向链表尾部的数据(表示最久未使用),并将新数据插入到链表头部。

具体说明

假设我们有一个固定大小为3的LRU缓存,现在按照以下顺序访问数据:

访问顺序: 1 -> 2 -> 3 -> 1 -> 4 -> 1

下面是每一步的详细说明:

  1. 访问1:缓存为空,将1加入缓存。

    • 缓存: {1}
  2. 访问2:2不在缓存中,将2加入缓存。

    • 缓存: {1, 2}
  3. 访问3:3不在缓存中,将3加入缓存。此时缓存满,根据LRU算法,最早加入的1将被替换掉。

    • 缓存: {2, 3}
  4. 再次访问1:1不在缓存中,将1重新加入缓存。由于缓存已满,此时会替换掉最久未使用的2。

    • 缓存: {3, 1}
  5. 访问4:4不在缓存中,将4加入缓存。此时会替换掉最久未使用的3。

    • 缓存: {1, 4}
  6. 再次访问1:1已经在缓存中,并且是最近访问的,所以只需要将其移动到链表头部即可。

    • 缓存: {4, 1}

最终,缓存中的数据顺序是 {4, 1},其中4是最久未被访问的数据,1是最近被访问的数据。

Python实现示例

以下是使用Python实现的一个简单的LRU缓存:

from collections import OrderedDictclass LRUCache:def __init__(self, capacity: int):self.cache = OrderedDict()self.capacity = capacitydef get(self, key: int) -> int:if key not in self.cache:return -1else:# Move the key to the end to show that it was recently usedself.cache.move_to_end(key)return self.cache[key]def put(self, key: int, value: int) -> None:if key in self.cache:# Update the value and move it to the endself.cache.move_to_end(key)else:if len(self.cache) == self.capacity:# Pop the first item as it's the least recently usedself.cache.popitem(last=False)# Insert the new key-value pairself.cache[key] = value# 使用LRU缓存
cache = LRUCache(2)
cache.put(1, 1)   # 缓存是 {1=1}
cache.put(2, 2)   # 缓存是 {2=2, 1=1}
print(cache.get(1)) # 返回 1, 缓存是 {2=2, 1=1}
cache.put(3, 3)   # LRU 替换 2,缓存是 {3=3, 1=1}

在这个例子中,OrderedDict 维护了访问顺序,使得我们可以快速地移动最近访问的项到末尾,以及在必要时移除最早访问的项。

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

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

相关文章

【人工智能基础】知识表示和专家系统

目录 一、知识 知识 产生式表示法 产生式表示形式 确定的事实性知识的产生式表示 不确定的事实性知识的产生式表示 确定的规则知识的产生式表示 不确定的规则知识的产生式表示 产生式系统构成 优点 缺点 语义网络 优点 缺点 框架 框架的一般结构 框架的继承 优…

golang本地缓存库之bigcache

1. 前言 上周工作之余逛github看到一个本地缓存库bigcache,这个是allegro公司开源的一个项目,主要是用于本地缓存使用,根据他们的博客说明,他们编写这个库最初的目的就是实现一个非常快速的缓存服务。 看了下bigcache这个库的源…

【信号与系统 - 10】拉普拉斯变换

1 定义 周期信号的傅里叶变换那篇提到了&#xff1a; F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 这个定义式需要满足绝对可积&#xff0c;即 ∫ − ∞ ∞ ∣ f ( t ) ∣ d t < ∞ \int…

ant design vue + jeecgboot 实现本地上传视频及播放视频功能

文章目录 上传视频1. 上传按钮事件2. 上传按钮触发3. 声明变量visible_uploadVideov4. 上传视频弹窗5. 保存视频6. 关闭上传视频弹窗 播放视频1. 获取上传后的视频1.1 插槽2. 触发播放视频事件3. 播放视频弹窗4. 暂停视频 上传视频 1. 上传按钮事件 点击上传按钮事件 --这个地…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

IDEA中添加servlet模板

官方代码链接 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.*; import javax.servlet.http.*;

C++奇迹之旅:构造函数和析构函数

文章目录 &#x1f4dd;类的6个默认成员函数&#x1f320; 构造函数&#x1f309; 概念&#x1f309;特性&#x1f309;三种默认构造函数 &#x1f320; 析构函数&#x1f320; 特性&#x1f6a9;总结 &#x1f4dd;类的6个默认成员函数 如果一个类中什么成员都没有&#xff0…

iOS重签名-超详细,附排错

文章目录 重签名步骤步骤 1: 准备必要的材料步骤 2: 解压 .ipa 文件步骤3:将 Provisioning Profile 复制到 Payload 目录步骤 4: 移除原来的签名步骤 5: 使用新的证书和 Provisioning Profile 进行重签名步骤 6: 重新打包 .ipa 文件步骤 7: 安装和测试得到provisioning file和…

Python编程玩转二维码

文章目录 Python编程玩转二维码第一部分&#xff1a;背景介绍第二部分&#xff1a;qrcode库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方案第七部分…

微信小程序展示倒计时

html <view class"countdown"> <text>倒计时&#xff1a;</text> <text wx:for"{{countdown}}" wx:key"index">{{item}}</text> </view> ts data: {countdown: [], // 存放倒计时数组 targetTime:…

vue项目多语言配置

1. 安装 Vue I18n&#xff1a;首先安装 Vue I18n 库&#xff0c;我这里使用 npm 进行安装&#xff1a; npm install vue-i18n2. 创建语言文件&#xff1a;在你的项目中创建一个文件夹用于存放多语言文件&#xff0c;例如 locales&#xff0c;然后在这个文件夹中创建每种语言的…

【CSAPP/计组】#1 数的存储与表示方法、机器中浮点数加减法详解

文章目录 前言一、定点格式定点整数 二、浮点数的表示方法2.1 浮点数存储2.2 浮点数加减法a. 操作数检查b. 对阶c. 尾数相加与检查溢出d. 结果规格化与溢出处理e.舍入处理 Some tips: 为什么进位/双符号判断法有效的通俗解释&#xff1f;Some tips:符号位拓展 前言 计算机中常…

【归并】Leetcode 排序数组

题目讲解 912. 排序数组 算法讲解 使用归并算法排序数组&#xff0c;我们先在数组中寻找一个mid点&#xff0c;然后把数组分成了两部分&#xff0c;我们先排左部分&#xff0c;排左边部分的时候有需要将当前的子数组分成两部分&#xff0c;继续循环&#xff0c;直到当前子数组…

【结构型模式】装饰器模式

​一、装饰器模式概述 装饰器模式&#xff08;装饰者模式&#xff09;定义&#xff1a;装饰器模式动态地将责任附加到对象上。若要拓展功能&#xff0c;装饰者提供了比继承更有弹性地替代方案。&#xff08;对象结构型模型&#xff09;通俗点来说&#xff1a;动态的给一个对象增…

淘宝购物更智能:taobao.item_search API接口实现关键字精准匹配

随着电子商务的飞速发展&#xff0c;淘宝作为中国最大的网络购物平台之一&#xff0c;为亿万消费者提供了便捷、丰富的购物体验。然而&#xff0c;在海量商品中快速找到符合自己需求的商品&#xff0c;一直是消费者面临的挑战。为了提升购物体验&#xff0c;淘宝开放平台提供了…

【JS】js数字转k、w结尾 | 1000 = 1k

问题 数字转k、w结尾 如&#xff1a;10001k 100001w 码 /*** 数字转k,w* param {Number} num * returns String*/ const numberTokw num > {if (num < 1000) return numlet endStr w,numVal 10000;if (num > 999 && num < 10000) {endStr knumVal …

使用python socket搭建Client测试平台

目录 概述 1 背景 2 Client功能实现 2.1 何谓Client 2.2 代码功能介绍 2.3 代码实现 2.3.1 代码介绍 2.3.2 代码内容 3 测试 3.1 PC上创建Server 3.2 同一台PC上运行Client 3.2.1 建立连接 3.2.2 测试数据交互 3.3 Linux 环境下运行Client 3.3.1 建立连接 3.3.…

ElasticSearch实战之项目搜索高亮

文章目录 1. 前情配置2、数据操作2.1 操作API2.2 数据入库 3. 高亮搜索3.1 方法封装3.2 高亮搜索 1. 前情配置 为满足ElasticSearch可在项目中实现搜索高亮&#xff0c;我们需要先做一些前情配置 导入ElasticSearch依赖 <dependency><groupId>org.springframewor…

Linux网络实战(三)- Samba服务器搭建

Linux网络实战&#xff08;三&#xff09;- Samba服务器搭建 1 安装Samba服务软件编程要求输出输入 2 Samba服务器启动/关闭编程要求输出输入 3 Samba客户端编程要求输出输入 1 安装Samba服务软件 编程要求 本关任务是学会如何在线安装samba软件。 具体编程要求如下&#xf…

两个表归并为有序表

先排序&#xff0c;在逐个比较插入&#xff0c;最坏时间复杂度为表1长度表2长度-1 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h>typedef struct List {int* elem;//存储空间地址int length;//表长 }List;void sortList(List* p, int …