当前位置: 首页 > 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);
 */

相关文章:

  • 学习 - 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):矩阵特征值计算
  • 主流网站建设服务器有哪些/公司网站推广运营
  • 做网站首页ps/兰州网站seo
  • 绵阳做网站哪家公司好/河北seo基础入门教程
  • 上海做兼职上哪个网站/外贸网站推广方式
  • 邦邻营销型网站建设/seo上海优化
  • 长春网站建设有什么/郑州seo技术