首页 > 其他分享 >LRU

LRU

时间:2024-03-29 20:23:11浏览次数:16  
标签:node map int DLinkedNode value LRU key

LRU
https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

class LRUCache {

    HashMap<Integer,DLinkedNode> map;
    int dLinkSize;
    int capacity;
    DLinkedNode head;
    DLinkedNode tail;
    class DLinkedNode{
        int key;
        int value;
        DLinkedNode prior;
        DLinkedNode next;
        public DLinkedNode(){ }
        public DLinkedNode(int key,int value){
             this.key = key;
             this.value = value;
        }
    }

    public LRUCache(int capacity) {
        this.map = new HashMap<>();
        this.dLinkSize = 0;
        this.capacity = capacity;
        this.head = new DLinkedNode();
        this.tail = new DLinkedNode();
        head.next = tail;
        tail.prior = head;
    }

    public int get(int key) {
        if (map.containsKey(key)){
            DLinkedNode node = map.get(key);
            moveNodeToHead(node);
            return node.value;
        }else {
            return -1;
        }
    }

    public void put(int key, int value) {
        if (map.containsKey(key)){
            DLinkedNode node = map.get(key);
            node.value = value;
            moveNodeToHead(node);
        }else if (dLinkSize < capacity){
            DLinkedNode newNode = addNodeHead(key,value);
            map.put(key,newNode);
        }else {
            int curKey = deleteTailNode();
            map.remove(curKey);
            DLinkedNode newNode = addNodeHead(key,value);
            map.put(key,newNode);
        }
    }
    private DLinkedNode addNodeHead(int key,int value){
        DLinkedNode node = new DLinkedNode(key,value);
        moveNodeToHeadHelper(node);
        dLinkSize++;
        return node;
    }
    private void moveNodeToHead(DLinkedNode node){
        removeNode(node);
        moveNodeToHeadHelper(node);
    }
    private int deleteTailNode(){
        int key = tail.prior.key;
        removeNode(tail.prior);
        dLinkSize--;
        return key;
    }
    private void removeNode(DLinkedNode node){
        node.prior.next = node.next;
        node.next.prior = node.prior;
    }
    private void moveNodeToHeadHelper(DLinkedNode node){
        node.next = head.next;
        head.next.prior = node;
        head.next = node;
        node.prior = head;
    }
}

总结: 用hashmap存key和链表节点,双向链表的头代表新的或刚使用的,双向链表的尾代表要删除的。双向链表维护虚拟头结点,虚拟尾结点来统一操作。 要注意put的判断,要先看key在不在map中,而不是先看链表长度是不是小于容量,因为会发生链表长度没到容量,但是map中已经存在key,想要覆盖的情况,这个是我踩过的坑。

标签:node,map,int,DLinkedNode,value,LRU,key
From: https://www.cnblogs.com/jeasonGo/p/18104549

相关文章

  • go实现LRU
    packagemainimport"fmt"typeLRUCachestruct{ lengthint capint cachemap[interface{}]*DoubleLinkNode head*DoubleLinkNode tail*DoubleLinkNode}//双链表节点//头节点和尾节点不存数据,方便处理typeDoubleLinkNodestruct{ pre*DoubleLi......
  • lua lru算法
    --定义一个双向链表节点localNode={}Node.new=function(key,value)localnode={}node.key=keynode.value=valuenode.prev=nilnode.next=nilreturnnodeend--定义LRU缓存类localLRUCache={}LRUCache.new=function(m......
  • Walrus 0.6发布:预览资源变更、丰富公有云支持,满足企业多云需求
    近日,数澈软件Seal(以下简称“Seal”)宣布基于IaC的开源应用管理平台Walrus0.6正式发布! 在之前的版本中,Walrus引入应用模型并优化了应用部署体验,前者为屏蔽基础设施复杂度提供了抽象层(即资源定义和资源),运维人员可以在资源定义内配置匹配规则、UISchema,同时开发人员通过创建......
  • 面试被问道:LRU算法的优化手段(二)
    大家好,我是程序员阿药。接上一篇LRU算法的优化手段(一),今天分享的是优化手段(二),也就是如何优化LRU算法解决缓存污染问题。话不多说,发车!当一次读取批量数据页时,这些数据页都将加入到activeList链表头部或hot区的链表头部,很有可能就会将之前的热点数据页从activeList或hot区中淘汰......
  • 如何实现缓存与LRU算法以及惰性过期
    如何实现缓存与LRU算法以及惰性过期实现缓存概述与LRU算法详解缓存的基本概念与作用在计算机科学中,缓存是一种临时存储数据的技术,用于加速数据访问速度。通过将常用数据存储在高速缓存中,可以减少对慢速存储器(如磁盘或数据库)的访问次数,从而提高系统的性能和响应速度。缓存......
  • 如何将应用一键部署至多个环境?丨Walrus教程
    在Walrus平台上,运维团队在资源定义(ResourceDefinition)中声明提供的资源类型,通过设置匹配规则,将不同的资源部署模板应用到不同类型的环境、项目等。与此同时,研发人员无需关注底层具体实现方式,通过创建Resource对象声明需要使用的资源类型及基本信息,就可以灵活地在各种环境中自......
  • C++ LRU缓存
    题目://构建双向链表的节点结构(要有两个构造函数)structNode{intkey,val;Node*pre;Node*next;Node():key(0),val(0),pre(nullptr),next(nullptr){}Node(int_key,int_val):key(_key),val(_val),pre(nullptr),next(nullptr){}};class......
  • LRU cache
    https://leetcode.cn/problems/lru-cache/设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构配图全部来自于lc的题解我门来看下图所示的数据结构每个key对应着一个节点,每个节点存有key,value,prev,next。我们现在将该图稍微改动一下,添加一个将表头和表尾去掉,换......
  • LRU
    什么是LRULRU是LeastRecentlyUsed的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。实现思路开始时,内存中没有页面。每次访问页面时,先检测内存中是否存在该页面,若不存在则将该页面加载到内存“末尾”,若存在则直接访问该页面,并将该页面移到内......
  • 开年喜报!Walrus成功入选CNCF云原生全景图
    近日,数澈软件Seal(以下简称“Seal”)旗下开源应用管理平台Walrus成功入选云原生计算基金会全景图(CNCFLandscape)并收录至“AppDefinitionandDevelopment-ApplicationDefinition&ImageBuild”板块,该板块包含了Helm、Backstage、Dapr等知名开源项目。 图片截自:htt......