LRU缓存通过哈希表和双向链表结合实现,get和put操作均达到O(1)时间复杂度;当缓存满时淘汰最久未使用数据,利用哨兵节点简化链表操作,确保高效访问与顺序维护。
LRU(Least Recently Used)缓存淘汰算法的核心思想是:当缓存满时,优先淘汰最久未使用的数据。为了高效实现“快速访问”和“快速调整使用顺序”,通常结合哈希表与双向链表来完成。
在C++中,我们可以利用自定义的双向链表节点和unordered_map哈希表,实现O(1)时间复杂度的get和put操作。
使用双向链表维护访问顺序:最近使用的节点放在链表头部,最久未使用的放在尾部。哈希表用于存储键到链表节点的指针,实现O(1)查找。
关键操作包括:
哈希表定义为:unordered_map
维护两个哨兵节点:head 和 tail,简化边界处理。
需要封装几个辅助函数:
回其key,用于从哈希表中删除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-youjiankuohaophpcnprev-youjiankuohaophpcnnext = node-youjiankuohaophpcnnext;
node-youjiankuohaophpcnnext-youjiankuohaophpcnprev = node-youjiankuohaophpcnprev;
}
void addToHead(Node* node) {
node-youjiankuohaophpcnnext = head-youjiankuohaophpcnnext;
node-youjiankuohaophpcnprev = head;
head-youjiankuohaophpcnnext-youjiankuohaophpcnprev = node;
head-youjiankuohaophpcnnext = node;
}
void moveToHead(Node* node) {
removeNode(node);
addToHead(node);
}
Node* removeTail() {
Node* node = tail-youjiankuohaophpcnprev;
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-youjiankuohaophpcnvalue;
}
void put(int key, int value) {
if (cache.find(key) != cache.end()) {
Node* node = cache[key];
node-youjiankuohaophpcnvalue = value;
moveToHead(node);
} else {
Node* newNode = new Node(key, value);
cache[key] = newNode;
addToHead(newNode);
if (cache.size() youjiankuohaophpcn capacity) {
Node* removed = removeTail();
cache.erase(removed-youjiankuohaophpcnkey);
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缓存,适用于频繁读写、容量受限的场景。注意内存释放,避免泄漏。
# node
# ai
# c++
# ios
# stream
# red
# 封装
# include
# int
# 指针
# using
# class
# public
# private
# Struct
# Namespace
# cap
# 算法
# 链表
# 放在
# 最久
# 移到
# 移除
# 几个
# 已有
# 适用于
# 自定义
# 若不
相关文章:
如何在自有机房高效搭建专业网站?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
如何在云指建站中生成FTP站点?
建站之星后台管理如何实现高效配置?
如何在景安服务器上快速搭建个人网站?
宝塔建站无法访问?如何排查配置与端口问题?
网站制作新手教程,新手建设一个网站需要注意些什么?
建站主机系统SEO优化与智能配置核心关键词操作指南
建站VPS能否同时实现高效与安全翻墙?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
临沂网站制作企业,临沂第三中学官方网站?
如何在七牛云存储上搭建网站并设置自定义域名?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何正确下载安装西数主机建站助手?
如何在IIS中新建站点并解决端口绑定冲突?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
定制建站哪家更专业可靠?推荐榜单揭晓
完全自定义免费建站平台:主题模板在线生成一站式服务
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
如何在腾讯云服务器上快速搭建个人网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
建站之星在线版空间:自助建站+智能模板一键生成方案
如何在云主机上快速搭建网站?
如何用腾讯建站主机快速创建免费网站?
建站之星后台密码如何安全设置与找回?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何通过cPanel快速搭建网站?
建站之星Pro快速搭建教程:模板选择与功能配置指南
ppt制作免费网站有哪些,ppt模板免费下载网站?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
招商网站制作流程,网站招商广告语?
Swift中switch语句区间和元组模式匹配
建站10G流量真的够用吗?如何应对访问高峰?
javascript中对象的定义、使用以及对象和原型链操作小结
建站之星图片链接生成指南:自助建站与智能设计教程
建站主机选哪种环境更利于SEO优化?
如何选择最佳自助建站系统?快速指南解析优劣
历史网站制作软件,华为如何找回被删除的网站?
如何通过万网虚拟主机快速搭建网站?
高端建站如何打造兼具美学与转化的品牌官网?
如何彻底卸载建站之星软件?
上海网站制作开发公司,上海买房比较好的网站有哪些?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。