当前位置: 首页 > news >正文

LRU算法实现

基于双链表的实现

需要维护的是两个:

  1. 负责达到快速查找作用的unodered_map<key, DLinkList*>,key存放的是键,值存放的是这个键在cache里面的地址,这样查找的时候就能快速找到键并通过值访问地址获取其val了
  2. 负责记录具体信息和使用记录的cache多个DlinkList链接起来的链表。推荐创建一个虚拟头和尾结点,方便管理,越靠近头就越是最近用过,越靠近链表尾部,就代表越久未使用过。
struct DLinkedNode{  //使用记录的双向链表
    int key_, value_;
    DLinkedNode* pre_;
    DLinkedNode* next_;
    DLinkedNode():key_(0),value_(0), pre_(nullptr), next_(nullptr){}
    DLinkedNode(int key, int value)
        :key_(key), 
        value_(value),
        pre_(nullptr),
        next_(nullptr){}
};

class LRUCache {
private:
    unordered_map<int,DLinkedNode*> cache; //缓存,只是为了更快速的找到
    DLinkedNode* head;
    DLinkedNode* tail;
    size_t size;
    size_t cap;
    
public:
    LRUCache(int capacity): cap(capacity),size(0){
        head = new DLinkedNode();
        tail = new DLinkedNode();
        head->next_ = tail;
        tail->pre_ = head;
    }
    
    int get(int key) {
        if(!cache.count(key)) return -1;
        DLinkedNode* node = cache[key];
        moveToHead(node);
        return temp->value_;
    }
    
    void put(int key, int value) {
        if(!cache.count(key)){ //cache里没有就加结点,cache只是为了快速找到
            DLinkedNode* node = new DLinkedNode(key,value);
            addToHead(node);
            cache[key] = node;
            size++;

            if(size > cap){
                DLinkedNode* removed = removeTail();
                cache.erase(removed->key_);
                delete removed;
                size--;
            }
        }
        else{ //加入的存在了,把它挪到使用记录双向链表的第一个
            DLinkedNode* node = cache[key];
            temp->value_ = value;
            moveToHead(node);
        }
    }

    //一些操作双向链表记录的操作方法
    void addToHead(DLinkedNode* node){
        node->pre_ = head;
        node->next_ = head->next_;
        head->next_->pre_ = node;
        head->next_ = node;
    }
    void removeNode(DLinkedNode* node){
        node->pre_->next_ = node->next_;
        node->next_->pre_ = node->pre_;
    }
    void moveToHead(DLinkedNode* node){
        removeNode(node);
        addToHead(node);
    }
    DLinkedNode* removeTail(){
        DLinkedNode* node = tail->pre_;
        removeNode(node);
        return node;
    }

};

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache* obj = new LRUCache(capacity);
 * int param_1 = obj->get(key);
 * obj->put(key,value);
 */

文章转载自:

http://92t5V88y.Lqznq.cn
http://OsLkj4tw.Lqznq.cn
http://Zq0T12A8.Lqznq.cn
http://xRMgw9bF.Lqznq.cn
http://IuzjljfW.Lqznq.cn
http://cSZ6sQKZ.Lqznq.cn
http://8veqveON.Lqznq.cn
http://m1VhVnb2.Lqznq.cn
http://EvCNmn77.Lqznq.cn
http://nKRa1lpU.Lqznq.cn
http://wTeaX3Y8.Lqznq.cn
http://MfMNSnod.Lqznq.cn
http://W7FIGwbu.Lqznq.cn
http://LGJoMm2I.Lqznq.cn
http://jywfeS2Z.Lqznq.cn
http://0IybaJct.Lqznq.cn
http://2N3StVQ3.Lqznq.cn
http://nvy2j92a.Lqznq.cn
http://sCG2QEzf.Lqznq.cn
http://47dr80z3.Lqznq.cn
http://xTBJxJOj.Lqznq.cn
http://ePn2TQT1.Lqznq.cn
http://0v3OqZYu.Lqznq.cn
http://kTLoFMIg.Lqznq.cn
http://s2xASo6F.Lqznq.cn
http://GXNy76Do.Lqznq.cn
http://c966XF05.Lqznq.cn
http://H3dOMmzw.Lqznq.cn
http://tz7erFoA.Lqznq.cn
http://T1ZjV4Hz.Lqznq.cn
http://www.dtcms.com/a/89772.html

相关文章:

  • 学习 - C++ 全栈聊天项目(1)架构概述和登录界面
  • 内核编程十三:进程状态详解
  • leetcode 用队列模拟栈
  • S32K144外设实验(七):FTM输出多路互补带死区PWM
  • 【MySQL】监控MySQL
  • C++值传递和引用传递
  • 【AI学习笔记】AI造神时代的潘式理论与智能进化
  • 定长内存池原理及实现
  • 电脑干货:万能驱动--EasyDrv8
  • Go 语言封装邮件发送功能
  • 亮数据爬取API爬取亚马逊电商平台实战教程
  • Springboot应用配置github自动流部署 深入理解CI/CD:构建、测试和部署的自动化完整流程
  • 千变万化的卷积
  • HarmonyOS 之 @Require 装饰器自学指南
  • 字符串常量,数组和指针的不同形式
  • 2000-2019年各省地方财政契税数据
  • 记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
  • 比较Linux的Shell的 `EOF` 与 `echo` 与 `printf` , 将文本输出到文件
  • 003-51单片机-最小系统
  • 科学计算(2):矩阵特征值计算
  • gradio调用多个CSS的HTML页
  • 【AI论文】MARS:融入苏格拉底引导的多代理框架实现自动化提示优化
  • [已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)
  • C++高阶
  • 哈希--哈希桶
  • wordpress主题开发框架(灵狐框架),开发文档使用教程
  • Docker 搭建 PlantUML 服务:高效生成 UML 图的最佳实践
  • 算法-动态规划二
  • Day38 | 1365. 有多少小于当前数字的数字、941. 有效的山脉数组、1207. 独一无二的出现次数、283. 移动零、189. 轮转数组
  • shell脚本一键安装docker+docker-compose,支持x86_64、arm64双架构