新闻中心

C++怎么实现一个LRU缓存淘汰算法_C++结合哈希表与双向链表实现LRU Cache

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

c++怎么实现一个lru缓存淘汰算法_c++结合哈希表与双向链表实现lru cache

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 CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA

主要操作实现

需要封装几个辅助函数:

  • removeNode(Node* node):从链表中移除指定节点
  • addToHead(Node* node):将节点插入到头部
  • moveToHead(Node* node):将已有节点移到头部(表示最近使用)
  • removeTail():移除尾部节点,并返回其key,用于从哈希表中删除

完整代码示例

#include iostream> #include red_map> using namespace std;

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> cache; Node head; Node* tail; int capacity;

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离线安装依赖包的技巧与策略  快手官方唯一登录入口 谨防山寨钓鱼网站 

搜索