首页 > 其他分享 >LRU缓存实现

LRU缓存实现

时间:2023-09-24 18:44:24浏览次数:53  
标签:Node pre 缓存 cur 实现 next LRU key 节点

一. LRU缓存实现

使用双向链表保证O(1)的优先度更改,同时当做优先队列维护插入顺序
同时这里要结合哈希表,保证更改想要的节点

/*
定义Node 双向链表节点
定义 remove 进行删除节点(只删除节点在链表中的关系)
定义 update 更新指定节点的优先度
定义 insert 插入新的节点
*/


class LRUCache {
public:
    typedef struct Node {//双向链表
        int key;//在哈希中的键值,用于删除哈希
        int data;
        Node* pre;
        Node* next;
        Node() :  key(0), data(0), pre(nullptr), next(nullptr) {}
        Node(int key,int val) :key(key), data(val), pre(nullptr), next(nullptr) {}
    }Node,*pNode;

    int capacity;
    unordered_map<int,pNode> m;
    Node* listpre = new Node();
    Node* listtail = new Node();

    void remove(Node* cur){
        //更改节点关系
        Node* pre = cur->pre;
        Node* next = cur->next;
        pre->next = next;
        next->pre = pre;
    }
    void update(Node* cur){ //更新时间,就是把节点移到最后面,同时更改前后节点关系
        //更改节点关系
        remove(cur);
        //移动到最后面
        insert(cur);
    }
    void insert(Node* cur){ //插入缓存,就是把节点放到最后面
        listtail->pre->next = cur;
        cur->pre = listtail->pre;
        cur->next = listtail;
        listtail->pre = cur;
    }

    void release(){//清除内存,就是从链表头部删除节点,同时也要删除索引
        Node* cur = listpre->next;
        m.erase(cur->key);//删除索引
        remove(cur);
    }

    //要有个结构记录最近最久未使用,使用有序结构即可
    //访问后,如何对优先度进行更新,可以用哈希+链表,把指定节点剔除移到最后
    LRUCache(int capacity) {
        this->capacity = capacity;
        //初始化双向链表结构
        listpre->next  = listtail;
        listtail->pre = listpre;
    }
    
    int get(int key) {
        //这里首先判断是否存在
        if(m.count(key)==0) return -1;
        //存在则进行更新时间
        update(m[key]);
        return m[key]->data;
    }
    
    void put(int key, int value) {
        //首先判断是否存在,存在则进行更新
        if(m.count(key)){
            m[key]->data = value;//更新值
            //更新优先度
            update(m[key]);
            return;
        }
        //不存在进行插入
        if(m.size()==capacity) 
            release();//内存不够,释放一个节点
        Node* cur = new Node(key,value);
        m[key] = cur;//建立索引
        insert(cur);
    }
};

标签:Node,pre,缓存,cur,实现,next,LRU,key,节点
From: https://www.cnblogs.com/929code/p/17726403.html

相关文章

  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记3
    20211306密码系统设计与实现课程学习笔记3学习任务详情自学教材第10章,提交学习笔记大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?知识点归纳以及自己最有收获的内容,选择至少2个知识点利用......
  • Transformer架构解析及其pytorch实现
    备注本文对Transformer架构的分析来源于论文AttentionisAllYouNeed以及部分其引用的论文,可以理解为对该论文的翻译以及相关内容的整理。本文对Transformer的实现基于Pytorch,但是不直接调用Pytorch封装的Transformer,而是手动实现Encoder和Decoder等;与Transformer......
  • 信息安全系统设计与实现 学习笔记3
    一、总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?一门程序设计语言的必备要素和技能包括:语法:掌握语言的基本语法,包括变量、数据类型、运算符、流程控制语句、函数、类等。算法和数据结构:能够设计和实现常用的算法和数据结构,如......
  • 用Python实现的本地美食和餐饮业SEO策略
     当谈到本地美食和餐饮业的SEO(搜索引擎优化)策略时,Python是一种强大的编程语言,可以帮助我们自动化和优化各种任务。在这篇文章中,我将介绍一些使用Python实现的本地美食和餐饮业SEO策略的方法。 1.网站优化(WebsiteOptimization): -使用Python的网页解析库(如BeautifulSoup)来......
  • #20211105李宜时《信息安全系统设计与实现》第三周学习总结
    20211105李宜时《信息安全系统设计与实现》第三周学习总结学习不同编程语言的必备要素和技能1.语法和基本结构了解编程语言的语法和基本结构是编程的第一步。这包括变量、数据类型、运算符、条件语句、循环结构等。以下是Python、C和Java中的示例代码片段:Python#定义变量并......
  • 《信息安全系统设计与实现》学习笔记3
    第十章sh编程sh脚本sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。创建文件文本mysh,包含:#!/bin/bash#commentlineechohellosh脚本与C程序sh脚本和C程序有一些相似之处,但他们在根本上是不同的。sh是解释程序,逐行读取sh脚本并直接执行这些行,而C......
  • 20211128李杰《信息安全系统设计与实现》第十章笔记
    一、任务内容自学教材第10章,提交学习笔记(10分) 大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的? ,评分标准如下 1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行......
  • 2023-2024-1 20211211《信息安全系统设计与实现(上)》第10章学习笔记
    内容目录一、程序设计语言与shell脚本(1)一门程序设计语言有哪些必备要素和技能(2)这些要素和技能在shell脚本中如何呈现二、sh脚本三、sh脚本与C程序四、命令行参数五、sh变量六、sh中的引号七、sh命令(1)内置命令(2)linux命令八、sh控制语句(1)if-else-fi(2)if-elif-e......
  • 从一个golang 员工emp数组中,找到其中name相同的元素,把结果放到一个新数组里,代码实现
    内容来自对chatgpt的咨询为了找到具有相同名称的员工,并将结果放入一个新的数组中,我们可以首先使用一个映射(map)来存储每个名称及其出现的次数。然后,我们可以遍历原始数组并使用映射来判断是否有重复的名称。以下是一个示例代码,演示如何实现这一目标:packagemainimport( ......
  • 《信息安全系统设计与实现》第三周学习笔记
    一门程序语言必备的要素和技能语法和语义:了解程序设计语言的语法规则和语义约定,包括变量声明、语句结构、运算符、条件语句、循环结构等。掌握正确的语法和语义可以编写有效且不会造成语法错误的程序。数据类型:了解不同数据类型的概念和用法,例如整数、浮点数、字符串、布尔值等......