新闻中心
C++怎么实现一个LRU缓存淘汰算法_C++结合哈希表与双向链表实现LRU Cache
LRU缓存通过哈希表和双向链表结合实现,get和put操作均达到O(1)时间复杂度;当缓存满时淘汰最久未使用数据,利用哨兵节点简化链表操作,确保高效访问与顺序维护。

LRU(Least Recently Used)缓存淘汰算法的核心思想是:当缓存满时,优先淘汰最久未使用的数据。为了高效实现“快速访问”和“快速调整使用顺序”,通常结合哈希表与双向链表来完成。
在C++中,我们可以利用自定义的双向链表节点和unordered_map哈希表,实现O(1)时间复杂度的get和put操作。
设计思路
使用双向链表维护访问顺序:最近使用的节点放在链表头部,最久未使用的放在尾部。哈希表用于存储键到链表节点的指针,实现O(1)查找。
关键操作包括:
- get(key):若存在,从链表中取出并移到头部;否则返回-1
- put(key, value):若已存在,更新值并移至头部;若不存在且缓存满,则删除尾部节点,插入新节点到头部
核心结构定义
struct Node { int key; int value; Node* prev; Node* next; Node(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {} };哈希表定义为:unordered_map<int node> cache;</int>
维护两个哨兵节点:head 和 tail,简化边界处理。
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
主要操作实现
需要封装几个辅助函数:
- removeNode(Node* node):从链表中移除指定节点
- addToHead(Node* node):将节点插入到头部
- moveToHead(Node* node):将已有节点移到头部(表示最近使用)
- removeTail():移除尾部节点,并返回其key,用于从哈希表中删除
完整代码示例
#include iostream> #includestruct Node { int key, value; Node prev, next; Node(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {} };
class LRUCache {
private:
unordered_map
void removeNode(Node* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
void addToHead(Node* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
void moveToHead(Node* node) {
removeNode(node);
addToHead(node);
}
Node* removeTail() {
Node* node = tail->prev;
removeNode(node);
return node;
}public: LRUCache(int cap) : capacity(cap) { head = new Node(0, 0); tail = new Node(0, 0); head->next = tail; tail->prev = head; }
int get(int key) {
if (cache.find(key) == cache.end()) return -1;
Node* node = cache[key];
moveToHead(node);
return node->value;
}
void put(int key, int value) {
if (cache.find(key) != cache.end()) {
Node* node = cache[key];
node->value = value;
moveToHead(node);
} else {
Node* newNode = new Node(key, value);
cache[key] = newNode;
addToHead(newNode);
if (cache.size() > capacity) {
Node* removed = removeTail();
cache.erase(removed->key);
delete removed;
}
}
}
~LRUCache() {
for (auto& pair : cache) {
delete pair.second;
}
delete head;
delete tail;
}};
测试示例:
int main() { LRUCache lru(2); lru.put(1, 1); lru.put(2, 2); cout基本上就这些。通过哈希表+双向链表的组合,我们实现了高效的LRU缓存,适用于频繁读写、容量受限的场景。注意内存释放,避免泄漏。
以上就是C++怎么实现一个LRU缓存淘汰算法_C++结合哈希表与双向链表实现LRU Cache的详细内容,更多请关注其它相关文章!
# ai
# 易森科技seo优化方法
# 微信推广营销吧tt团队引领
# 南京推广网站商家电话
# 适用于
# 已有
# 与其他
# 几个
# 移除
# 如何使用
# 移到
# 最久
# 放在
# 链表
# red
# stream
# ios
# c++
# node
# seo刷题带答案
# 新蔡信息流推广营销
# 牡丹江seo排名电话
# 安阳短视频seo搜索
# 井陉竞价网站推广方案最新
# 推广网络营销外包
# 金坛市网站推广公司
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
内存检查:在VS Code中调试C++时的内存视图
PHP 枚举:根据字符串获取枚举案例的策略与实现
《刺客信条:影》PS5 Pro和Switch 2画面对比
Discord Slash 命令响应超时问题的异步解决方案
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍
抖音极速版最新版本 抖音极速版官方下载地址
使用Python高效删除Word宏并转换DOCM为DOCX格式
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
Python实时数据流中的动态最值查找策略
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
学习通网页版快速入口 学习通官网网页版直接打开
Lar*el Excel导入时生成自定义递增ID的策略与实践
J*a中实现Go语言select通道多路复用机制
Excel文件在线转换快速入口 Excel在线格式转换网站
css绝对定位元素脱离父容器怎么办_确保父元素position非static
学习通网页版官方登录 超星学习通电脑端入口指南
iCloud登录入口网页版 苹果iCloud官网登录
58动漫网在线官方网 58动漫网正版动漫入口网址
2026年CSGO开箱网站推荐 CSGO开箱平台精选
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
c++ 命名空间怎么用 c++ namespace使用指南
解决Django多数据库/多Schema环境下外键迁移问题
海棠电脑版入口_通过电脑访问海棠官网阅读
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
J*aScript实现动态背景色下的文本与按钮颜色自适应调整
《主播少女的秘密账号迷宫》首支宣传片
J*aScript Promise链中如何正确终止后续.then执行并处理错误
excel如何生成目录 excel一键生成工作表目录超链接
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
163邮箱官方主页登录 直达网易邮箱登录核心页面
Tailwind CSS line-clamp 布局问题解析与修复指南
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换
将HTML动态表格多行数据保存到Google Sheet的教程
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
Pyrogram与g4f集成:异步编程实践与常见错误解决
Node.js中HTML按钮与J*aScript函数交互的正确姿势
composer的"require-dev"部分是用来做什么的?
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
快手官方唯一登录入口 谨防山寨钓鱼网站


2025-11-22
浏览次数:次
返回列表
Node* node = cache[key];
moveToHead(node);
return node->value;
}
void put(int key, int value) {
if (cache.find(key) != cache.end()) {
Node* node = cache[key];
node->value = value;
moveToHead(node);
} else {
Node* newNode = new Node(key, value);
cache[key] = newNode;
addToHead(newNode);
if (cache.size() > capacity) {
Node* removed = removeTail();
cache.erase(removed->key);
delete removed;
}
}
}
~LRUCache() {
for (auto& pair : cache) {
delete pair.second;
}
delete head;
delete tail;
}