首页 > 其他分享 >LRU cache

LRU cache

时间:2024-03-02 20:44:17浏览次数:30  
标签:node dummy cache next LRU key prev 节点

https://leetcode.cn/problems/lru-cache/
设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构
配图全部来自于lc的题解

我门来看下图所示的数据结构

每个key对应着一个节点,每个节点存有key,value,prev,next。

我们现在将该图稍微改动一下,添加一个将表头和表尾去掉,换成一个哨兵节点dummy,并改成双向循环链表。就像下图一样

细节都有注释,直接看代码

//哈希将双向循环链表
//哈希每一个key对应的节点,每个节点存有key,value,prev,next

//每次执行get()或put()都算使用一次其参数对应的key值的关键字
//要将其从原来位置删除然后重新头插进来

//最久未使用的关键字就是链表尾部的关键字

struct Node
{
    int key,value;
    Node*prev,*next;

    Node(int k = 0,int v = 0) : key(k) , value(v) {}
};

class LRUCache {
private:
    int capacity; //容量
    int cnt = 0; //当前节点数量。一定要记得初始化
    Node*dummy; //哨兵节点
    unordered_map<int,Node*>h;  //每个key对应一个节点
public:
    LRUCache(int capacity) : capacity(capacity) , dummy(new Node()) {
        dummy->next = dummy->prev = dummy;  //双向循环链表
    }
    
    int get(int key) {
        if(h[key] == nullptr) return -1; //哈希值为空,关键字key不在缓存中
        auto node = h[key]; 
        node->next->prev = node->prev; //删除这个节点
        node->prev->next = node->next;

        dummy->next->prev = node;      //头插当前节点
        node->next = dummy->next;
        node->prev = dummy;
        dummy->next = node;

        h[key] = node;              //要记得更新h[key]
        return node->value;
    }
    
    void put(int key, int value) {
       Node *node;
       if(h[key]!=nullptr)  //若key存在,将节点删除
       {
           h[key]->value = value;
           node = h[key];
           node->next->prev = node->prev; //删除当前节点
           node->prev->next = node->next;
       }
       else //若key不存在,则新建一个节点
       {
           node = new Node(key,value);
           h[key] = node;  
           cnt++;
       }
       dummy->next->prev = node;  //不管key在不在,都头插节点
       node->next = dummy->next;
       node->prev = dummy;
       dummy->next = node;
       if(cnt > capacity) //若当前节点数量超过容量,将链表尾部节点删除
       {
           node = dummy->prev;
           h[node->key] = nullptr;
           dummy->prev = node->prev;
           node->prev->next = dummy;
           cnt--;
       }
    }
};

标签:node,dummy,cache,next,LRU,key,prev,节点
From: https://www.cnblogs.com/algoshimo/p/18049208

相关文章

  • LRU
    什么是LRULRU是LeastRecentlyUsed的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。实现思路开始时,内存中没有页面。每次访问页面时,先检测内存中是否存在该页面,若不存在则将该页面加载到内存“末尾”,若存在则直接访问该页面,并将该页面移到内......
  • Ehcache 介绍(1)--Ehcache 功能特性
    Ehcache是一个开源的、基于标准的缓存工具,它能提升性能、减轻数据库负载并简化可扩展性。由于其稳健性、经得起考验的特点以及与其他流行框架的集成,Ehcache成为最广泛使用的基于Java的缓存工具。Ehcache从进程内缓存一直扩展到混合的进程内/进程外部署,可以处理TB的数据。1......
  • JeecgBoot集成宝兰德CacheDB
    BESCacheDB介绍BESCacheDB(简称BCD)是一款宝兰德自研的分布式高性能KV存储数据库,可完全兼容Redis协议标准,支持基于内存和文件的持久化存储,保证数据的安全可靠。主要解决高并发、大数据量场景下的数据访问性能问题,具有高性价比、高可靠、弹性伸缩、高可用等特点。BCD部署(单机)......
  • 基于 Fluid+JindoCache 加速大模型训练的实践
    作者:王涛(扬礼)、陈裘凯(求索)、徐之浩(东伝)背景时间步入了2024年,新的技术趋势,如大模型/AIGC/多模态等技术,已经开始与实际业务相结合,并开始生产落地。这些新的技术趋势不仅提高了算力的需求,也给底层基础设施带来了更大的挑战。在计算方面,以GPU和FPGA等异构硬件为例,他们......
  • 开年喜报!Walrus成功入选CNCF云原生全景图
    近日,数澈软件Seal(以下简称“Seal”)旗下开源应用管理平台Walrus成功入选云原生计算基金会全景图(CNCFLandscape)并收录至“AppDefinitionandDevelopment-ApplicationDefinition&ImageBuild”板块,该板块包含了Helm、Backstage、Dapr等知名开源项目。 图片截自:htt......
  • JetCacheUtil 删除本地及远端缓存
    publicclassJetCacheUtil{privateJetCacheUtil(){}/***删除缓存**/publicstaticbooleanremoveCache(CacheLocatecacheLocate){Assert.isTrue(StringUtils.hasText(cacheLocate.getCacheKey())&&StringUtils.hasT......
  • NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数
    NoSQL数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!【官网地址】:http://www.redisant.cn/nosql介绍直观的用户界面从单一应用程序中同时连接Redis、Memcached、SSDB、LevelDB、RocksDB,你可以快速轻松地创建......
  • CryptnetUrlCache
    CryptnetUrlCache是一个在Windows操作系统中用于存储从网络下载的证书的缓存目录。这个机制是Windows的加密API(CryptographicAPI)的一部分,主要用于存储和检索从网络上下载的证书验证链、证书吊销列表(CRLs)、以及证书信任列表(CTLs)等信息。这些信息是用于帮助Windows验证网......
  • ActivitiesCache
    ActivitiesCache是Windows10和更高版本中的一个特性,用于支持“时间轴”(Timeline)功能,这是一个系统级的功能,旨在帮助用户查看和继续之前在设备上的活动。这包括浏览网页、编辑文档、查看图片等活动。ActivitiesCache存储 在一个数据库文件中,通常位于用户的AppData目录下(例如......
  • 分布式缓存应用:Memcache 或 Redis
    为什么要使用分布式缓存高并发环境下,例如典型的淘宝双11秒杀,几分钟内上亿的用户涌入淘宝,这个时候如果访问不加拦截,让大量的读写请求涌向数据库,由于磁盘的处理速度与内存显然不在一个量级,服务器马上就要宕机。缓存可以将经常读取的数据存储在快速的内存中,从而避免了频繁访问慢速......