首页/新闻资讯/正文详情

LRU 缓存算法详解

发布时间:2026/9/24 11:59:36 来源:云帆数科 栏目:资讯中心
LRU 缓存算法详解
LRU 缓存算法一、什么是 LRULRULeast Recently Used最近最少使用是一种常见的缓存淘汰策略。核心思想当缓存空间满了优先淘汰最久没有被访问过的数据因为我们认为最近被访问过的数据未来更有可能再次被访问。举个生活化的例子你桌面上只能放 3 本书第 4 本要放上来时就把最久没翻过的那本收回书架。二、为什么要用「哈希表 双向链表」实现 LRU 需要同时满足两个操作都要高效O(1)快速查找给定 key能立刻定位到对应的缓存项。快速更新顺序访问某个 key 后要把它移到最近使用的位置容量满时要能快速删除最久未使用的项。数据结构查找插入/删除维护顺序数组O(n)O(n)麻烦哈希表O(1)O(1)不支持双向链表O(n)O(1)天然支持哈希表 双向链表O(1)O(1)O(1)所以经典做法是哈希表unordered_map存key - 链表节点迭代器用于 O(1) 查找。双向链表list按使用时间排序表头是最近使用表尾是最久未使用。三、完整实现代码classLRUCache{private:unordered_mapint,listpairint,int::iterator__hash;// key - 链表节点listpairint,int__list;// 双向链表存 {key, value}int__capacity;// 缓存容量public:LRUCache(intcapacity){__capacitycapacity;}intget(intkey){autoit__hash.find(key);if(it__hash.end())return-1;// 没找到__list.splice(__list.begin(),__list,it-second);// 把节点移到表头最近使用return__list.begin()-second;// 返回 value}voidput(intkey,intvalue){if(get(key)-1){// key 不存在插入新节点__list.insert(__list.begin(),{key,value});__hash[key]__list.begin();if(__list.size()__capacity){// 超出容量淘汰表尾最久未使用intpop_key__list.back().first;__list.pop_back();__hash.erase(pop_key);}}else{// key 已存在更新 value节点已在表头__list.begin()-secondvalue;}}};四、核心操作逐行解读1.get(key)—— 查找并标记为最近使用intget(intkey){autoit__hash.find(key);if(it__hash.end())return-1;__list.splice(__list.begin(),__list,it-second);return__list.begin()-second;}__hash.find(key)O(1) 判断 key 是否存在并拿到它在链表中的迭代器it-second。__list.splice(__list.begin(), __list, it-second)这是整个实现的关键。splice会把it-second指向的节点从原位置摘下接到表头整个过程是 O(1)不需要拷贝数据也不破坏其他节点的链接。这样就把刚访问过的数据移动到了最近使用的位置。2.put(key, value)—— 插入或更新voidput(intkey,intvalue){if(get(key)-1){// 不存在 → 新增__list.insert(__list.begin(),{key,value});__hash[key]__list.begin();if(__list.size()__capacity){// 超过容量 → 淘汰最久未使用的表尾intpop_key__list.back().first;__list.pop_back();__hash.erase(pop_key);}}else{// 已存在 → 直接更新 value此时节点已在表头__list.begin()-secondvalue;}}

相关推荐

A2B数字麦克风从零跑通:AD2428主从配置与SigmaStudio实战
A2B数字麦克风从零跑通:AD2428主从配置与SigmaStudio实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 11:59:36

科研AI工作台选型指南:Cursor、Codex、Papers AI、CoCalc与Deepnote实操对比
科研AI工作台选型指南:Cursor、Codex、Papers AI、CoCalc与Deepnote实操对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 11:59:36

IMU静态外参标定:六面法与SVD求解刚体旋转矩阵
IMU静态外参标定:六面法与SVD求解刚体旋转矩阵

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 11:59:30

自制皮安表:跨阻放大器与自动量程的微弱电流测量方案
自制皮安表:跨阻放大器与自动量程的微弱电流测量方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:27:11

非接触式生命体征监测技术路线与落地场景全解析
非接触式生命体征监测技术路线与落地场景全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:27:04

Fusion 360电路设计实战:从原理图到PCB全流程经验与技巧
Fusion 360电路设计实战:从原理图到PCB全流程经验与技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:27:04

Foobar2000播放SACD完全指南:从插件配置到闪退排查
Foobar2000播放SACD完全指南:从插件配置到闪退排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:26:58

S32K148 SAI深度解析:多协议音频接口与eDMA协同设计
S32K148 SAI深度解析:多协议音频接口与eDMA协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:26:58

机器学习股票预测方法综述:从传统模型到深度学习与新闻文本融合
机器学习股票预测方法综述:从传统模型到深度学习与新闻文本融合

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 12:26:52

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码