全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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 cache;

维护两个哨兵节点:head 和 tail,简化边界处理。

主要操作实现

需要封装几个辅助函数:

  • 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-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小时内与您取得联系。