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

LRU(Least Recently Used)缓存淘汰算法的核心思想是:当缓存满时,优先淘汰最久未使用的数据。为了高效实现“快速访问”和“快速调整使用顺序”,通常结合哈希表与双向链表来完成。
在C++中,我们可以利用自定义的双向链表节点和unordered_map哈希表,实现O(1)时间复杂度的get和put操作。
使用双向链表维护访问顺序:最近使用的节点放在链表头部,最久未使用的放在尾部。哈希表用于存储键到链表节点的指针,实现O(1)查找。
关键操作包括:
哈希表定义为:unordered_map<int node> cache;</int>
维护两个哨兵节点:head 和 tail,简化边界处理。
万彩商图
专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。
212
查看详情
需要封装几个辅助函数:
struct 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的详细内容,更多请关注其它相关文章!
# 移除
# 无人酒店推广营销方案
# 十堰seo全网营销
# 阿里的推广营销
# 汕尾网站建设营销推广
# 小说阅读网站建设素材
# 如何学习互联网推广营销
# 高碑店网站网站建设
# 中国近期关键词排名
# 汕头网站建设路
# 提供网站建设开发外包
# 几个
# 内存管理
# node
# 如何使用
# 移到
# 最久
# 数据结构
# 放在
# 自定义
# 链表
# red
# stream
# ios
# c++
# ai
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
MySQL多重关联查询:利用别名高效获取同一表的多个关联字段
悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口
解决C#跨线程访问XML对象的异常 安全的并发XML处理模式
顺丰快递收费标准查询_如何查看顺丰最新收费价格
PDF如何批量加注释_PDF多文件批注高亮操作教程
Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制
毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
《虎扑》取消评分记录方法
Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】
VS Code如何设置默认配置
如何外贸网站设计-能留住客户提升用户体验!
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
多多买菜门店端app订单查看方法
mysql中外键约束如何使用_mysql FOREIGN KEY操作
拷贝漫画2025网页版入口 拷贝漫画官网免费看全集
《深林》冬季章节图文攻略
Dash应用多值文本输入处理与类型转换教程
12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化
Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】
Golang如何初始化module项目_Golang module init使用说明
英国搜索:多数英国人认为语言搜索是未来搜索
支付宝网页版在线入口 支付宝官网电脑登录入口
PHP中实现JSON数据数组分页的教程
在Flask应用中安全高效地更新SQLAlchemy用户数据
铁路12306官网入口 铁路12306中国铁路官网登录首页
MySQL多重JOIN技巧:高效关联同一表获取多角色信息
优化 React onClick 事件处理:函数引用与箭头函数的对比
京东快递物流信息不更新怎么办_物流停滞原因与处理方法
Python实时数据流中高效查找最大最小值
《虎扑》关闭社区内容推荐方法
《长生:天机降世》火塔小怪大全
ao3入口镜像地址 ao3镜像入口可靠跳转
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
Bootstrap 5导航栏折叠功能失效:数据属性迁移指南
使用TinyButStrong生成HTML并结合Dompdf创建PDF教程
Win11怎么开启HDR_Windows 11显示器画质增强设置
search中maxlength属性用法解析
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
《广发易淘金》国债逆回购操作教程
《三国:谋定天下》平民全阶段通用阵容
C++ static关键字作用_C++静态成员变量与静态函数
小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】
歌词怎么展示在|直播|间视频号?有什么注意事项?
J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解
HTML Canvas文本样式定制指南:解决外部字体加载与应用难题
照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程
iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程
电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】
微信客户端怎么查看二维码_微信客户端个人二维码查看方法
2025-11-22
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。