链表----14.LRU缓存

hot100内容(2、链表的14个) 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。,表示两个非负整数。:对于每个测试用例,输出一行,表示两个链表相加后的结果,按逆序存储,各位数字用空格分隔;本题的核心是找到两个链表的公共节点,最优解法为双指针法,利用路程互补的思想让两个指针在交点相遇。本题要求在不修改链表的前提下,找到链表入环的第一个节点(如果有环),否则返回。不作为参数进行传递,仅用于描述链表的实际情况,输入数据仅提供链表的结构。个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。 阅读详情

题目链接 

/**

    需求分析:

            当达到容量上限时 淘汰最久未访问的元素 ---> 双向链表;头节点:最近访问的元素 尾节点:最久未访问的元素

            get put 时间复杂度均为O(1) ---> 哈希表

            两需求同时满足: 哈希表 + 双向链表

            即 双向链表维护各元素访问顺序,哈希表存储双向链表中的节点 两者搭配使用即可满足需求

    执行流程:

            添加元素:若未达到上限 将元素添加到双向链表头节点,以及哈希表中即可

                    若达到上限 定位到最久未访问的元素(双向链表尾节点)删除再添加即可 O(1)

            访问元素:利用哈希表直接访问O(1) 再将元素移动到头节点即可

            操作双向链表中节点时间复杂度也是O(1)的关键: 哈希表中直接存储链表中节点 先在hash表中直接定位到元素O(1) 再操作即可

    功能函数:

            添加元素到头节点

            删除指定节点

            移动节点到头部(先删除再重新添加)

    */

class LRUCache {
    /**
    需求分析: 
            当达到容量上限时 淘汰最久未访问的元素 ---> 双向链表;头节点:最近访问的元素 尾节点:最久未访问的元素
            get put 时间复杂度均为O(1) ---> 哈希表

            两需求同时满足: 哈希表 + 双向链表
            即 双向链表维护各元素访问顺序,哈希表存储双向链表中的节点 两者搭配使用即可满足需求

    执行流程:
            添加元素:若未达到上限 将元素添加到双向链表头节点,以及哈希表中即可
                    若达到上限 定位到最久未访问的元素(双向链表尾节点)删除再添加即可 O(1)
            访问元素:利用哈希表直接访问O(1) 再将元素移动到头节点即可

            操作双向链表中节点时间复杂度也是O(1)的关键: 哈希表中直接存储链表中节点 先在hash表中直接定位到元素O(1) 再操作即可

    功能函数:
            添加元素到头节点
            删除指定节点
            移动节点到头部(先删除再重新添加)
    */

    //定义双向链表
    public static class DLinkedNode {
        int key,value; //相较于传统链表 该场景下需要额外维护key
        DLinkedNode prev,next; 

         DLinkedNode() {};

        DLinkedNode(int key, int value) {
            this.key = key;
            this.value = value;
        }

        DLinkedNode(int key, int value, DLinkedNode prev, DLinkedNode next) {
            this.key = key;
            this.value = value;
            this.prev = prev;
            this.next = next;
        }

    }

    //哈希表
    private Map<Integer,DLinkedNode> cache = new HashMap<>();
    //最大容量
    private final int capacity;
    //当前大小
    private int size;
    //虚拟头节点 
    private  DLinkedNode dummyHead = new DLinkedNode();
    //虚拟尾节点
    private  DLinkedNode dummyTail = new DLinkedNode();

    //添加元素到头节点
    private void addToHead(DLinkedNode node) {
        //将node初步插入到头节点
        node.prev = dummyHead;
        node.next = dummyHead.next;

        //建立node前后的联系
        dummyHead.next.prev = node;
        dummyHead.next = node;
    }

    //删除指定节点
    private void removeNode(DLinkedNode node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }

    //移动节点至头部(先删除 再插入到头节点)
    private void moveTohead(DLinkedNode node) {
        removeNode(node);
        addToHead(node);
    }
    

    //初始化容量与虚拟节点
    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.size = 0;

        //初始化虚拟节点
        dummyHead.next = dummyTail;
        dummyTail.prev = dummyHead;
        
    }
    
    public int get(int key) {
        //从哈希表中读取元素 再移动至首位
        if(cache.get(key) == null) {
            return -1;
        }

        DLinkedNode node = cache.get(key);
        moveTohead(node);
        return node.value;
    }
    
    public void put(int key, int value) {
        //DLinkedNode node = new DLinkedNode(key,value);  如果关键字 key 已经存在,则变更其数据值 value
         DLinkedNode node = cache.get(key);
         if(node != null) {
            node.value = value;
            moveTohead(node);
            return;
         }

        node = new DLinkedNode(key,value);
        //先判断当前存储元素个数 若达到上限则先删除尾节点 再添加
        if(size >= capacity) {
            //删除尾节点
            DLinkedNode Tail = dummyTail.prev;
            removeNode(Tail);
            cache.remove(Tail.key);
            size--;
        }
        addToHead(node);
        cache.put(key,node);
        size++;
    }
}

/**
 * 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);
 */

java之LRU缓存实现 LRU缓存实现(Java) LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉,废话不多说,下面来说下Java版的LRU缓存实现 Ja 阅读详情

相关推荐

页面回收---LRU链表

一、页面回收概述  Linux中页面回收主要是通过两种方式触发的,一种是由“内存严重不足”事件触发的;一种是由后台进程 kswapd触发的,该进程周期性地运行,一旦检测到内存不足,就会触发页面回收操作。对于第一种情况,系统会调用函数 try_to_free_pages()去检查当前内存区域中的页面,回收那些最不常用的页面。对于第二种情况,函数 balance_pgdat()是入口函数。以下是

zouxiaoting的专栏 3131

LRU链表及LRU缓存

注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2 1、 关于LRU 2、系统存在的LRU链表 #define LRU_BASE 0 #define LRU_ACTIVE 1 #define LRU_FILE 2 enum lru_list { LRU_INACTIVE_ANON = LRU_BASE, LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE, LRU_INACTIVE_FILE = LRU_BASE + L

Blue summer的博客 3052

08-SD卡-TF卡硬件电路设计

SD卡-TF卡硬件电路设计

weixin_66510961的博客 8262

HOT100-链表类题

的输入如下(你设计的程序。

m0_57877510的博客 967

正交试验实战指南:从PICT工具到混合水平表应用

本文详细介绍了正交试验法在测试设计中的实战应用,从基础概念到PICT工具的高级使用技巧。通过混合水平表设计和工程化实践案例,帮助测试工程师高效解决参数组合爆炸问题,提升测试覆盖率与效率。特别适合兼容性测试和复杂系统验证场景。

weixin_29230865的博客 260

【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。R语言是一门应用场景广泛、简单易学的程序语言,APSIM模型开发了许多R语言辅助包,在APSIM模型的气候、土壤、管理措施等数据准备,自动化模拟,参数优化和结果分析上都发挥着重要的作用。案例一:APSIM模型输入参数和土壤文件的制备。

2303_79243743的博客 1047

代码随想录_链表

给你一个链表的头节点和一个整数,请你删除链表中所有满足的节点,并返回。

weixin_55902321的博客 389

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1947

LRU和最长前缀和(计算机网络算法)

最优时间:\(O(mn)\),m 字符串平均长度,n 字符串数量;空间\(O(1)\),原地处理 思路:拿第一个字符串当基准,逐个字符比对其余所有字符串,遇到不匹配 / 越界直接截断返回。

weixin_55526229的博客 158

电子元器件-接口电路篇:RS-232、RS485/422、I2C、SPI、USB、网口

以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;

qq_60226558的博客 890

RK3588开发笔记-5G模块(SIM8200、广和通FM160、移远RM500U)调试笔记

RK3588 CPU提供了丰富的外设接口,本文主要介绍通过usb3.0接口驱动5G模块来实现5g无线数据传输功能。在物联网和边缘计算领域,5G网络支持的高速率、低延时连接为应用带来了更多可能性。RK3588作为一款高性能SoC,适合用于5G联网应用。SIM8200广和通FM160和移远RM500U。在RK3588上调试5G模块可以为设备提供稳定的高速联网能力。本文介绍了如何配置和调试SIM8200、广和通FM160和移远RM500U模块,通过AT指令和QMI/MBIM工具实现5G数据连接。

flypig has a dream! 2675

链表(精选答案)

【代码】链表(精选答案)

JH359yj70的博客 228

把 SAP Fiori Launchpad 配置文件放进 MIME Repository:从上传、缓存控制到可访问路径的完整实践

文章摘要: 在 SAP Fiori 项目中,Launchpad 配置文件的部署是关键挑战,核心在于通过 MIME Repository 而非直接修改标准文件来实现稳定配置。与 BSP Repository 相比,MIME Repository 支持显式设置客户端缓存时间(如 SAP 推荐的 7 天),适合生产环境治理。配置文件需为 JSON 格式,部署时需确保路径可访问(通过 ICF node 和 external alias),并注意语法错误会导致静默失效。实操步骤包括:在 SE80 中创建专用目录、设置

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 94

力扣算法题 stage 2(链表)

算法学习笔记2

weixin_45758469的博客 364

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode Hot 100 题解 · 链表篇

本文主要总结了leetcode hot 100 题解:链表篇的所有题目,使用多种解法并带有详细的解释,方便笔试和面试复习。

clown20的博客 329

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

hot100 链表专题

hot100链表专题

I_CLK的博客 588

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

leetcode-hot100-链表

链表

XSYaaaaan的博客 382

效果实测:Qwen3-14B-AWQ处理复杂数据结构与算法问题的能力展示

本文介绍了如何在星图GPU平台上自动化部署Qwen3-14b_int4_awq镜像,并展示了该模型在解决复杂数据结构与算法问题中的实际应用。测试表明,该模型能高效处理动态规划、图论等算法问题,生成可执行代码并分析复杂度,适用于开发者快速验证算法思路和学习经典实现。

weixin_28933797的博客 333

字节跳动今年的期权

当时传言的,回购价格将从 200.41 美元,上涨到 226.07 美元,涨幅 12.8%,当时消息一出,大家都十分兴奋,因为涨幅达到了惊人的 12.8%,而此前,涨幅一般都在 5% 出头。如果关键字已经存在,则变更其数据值;,也开始了首次回购,此前豆包股的授予价格为 10 美元,本次回购价格为 13.08 美元,涨幅 30%,而且这涨幅还只是短短半年,未来去到多少,不敢想象。具体的,我们使用哈希表来存储「键值对」,键值对的键作为哈希表的 Key,而哈希表的 Value 则使用我们自己封装的。

宫水三叶的刷题日记 378

用单链表实现LRU算法

LRU的算法规则是当空间满时,将近期最少使用的数据删除掉,以释放空间。将近期一直活跃的数据保存着 package com.yillion.dtl.utils; import java.util.List; public class LinkedListData&lt;T&gt; { private int length; //定义链表的长度 private Node&l...

sujins5288的博客 1291

lru缓存、lru链表、内存回收内核源码讲解

一说起内存回收,就想起来以前看内存回收源码时,一脸懵逼、头脑发胀,shrink_zone那些函数看了一遍又一遍就是看不懂,自信心第一次受到严重打击。内存回收源码涉及的知识点太多:lru缓存、lru链表、page cache、脏页回写、伙伴系统、page映射、内存分配、swap页交换、逆向映射等等,基本跟内存管理扯上关系的知识点都有涉及到。需要有个循序渐进的学习方法,才能一点点搞懂内存回收的原理。 在内存紧张时,就会尝试回收文件页和匿名页page。大部分系统默认应该都没有配置swap交换,此时内存回收并.

dongzhiyan_hjp 3088

怒斩力扣热题100将(持续更新且自用)

力扣热题100,从小白视角出发进行代码讲解、思路讲解,希望可以帮助到大家。

jier6的博客 817

Java单链表实现LRU内存缓存淘汰算法

在了解什么是LRU算法时,得先清楚软件有哪些缓存,软件缓存分为:1、内存缓存;2、数据库缓存;3、网络缓存;速度依次减慢,缓存到内存中的数据,长时间可能会有一些无用的数据占用内存甚至导致内存雪崩的发生,为了解决这些,产生了LRU(Least Recently Used)算法。LRU算法只是解决问题的其中一种,还有包括FIFO(First In, First Out),LFU(Least Frequently Used)算法。这里我们只讲LRU算法的实现。

Shen_Dong的博客 336

LRU缓存实现

LRU Cache的LinkedHashMap实现 LRU Cache的链表+HashMap实现 LinkedHashMap的FIFO实现 调用示例 LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随...

包子进阶Java 182

缓存策略---LRU缓存

1、介绍LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”。 缓存有一定的大小限制,当没有满时,可以向缓存中添加;当满时,LRU缓存把最近最少使用的数据移除,让给最新读取的数据; 而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance。2、LRU cache的实现按照访问顺序维护缓存中数据,当访问一个时,则需要改变该

bh_xiaoxinba的博客 951
上一篇: 链表----13.合并 K 个升序链表
下一篇: 二叉树----1.二叉树的中序遍历
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值