设计LRU缓存结构

设计LRU/LFU缓存结构 模拟LRU和LFU 阅读详情
package com.heu.wsq.niuke.top200;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 设计LRU缓存结构
 * @author wsq
 * @date 2021/5/8
 * 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
 * set(key, value):将记录(key, value)插入该结构
 * get(key):返回key对应的value值
 * [要求]
 * set和get方法的时间复杂度为O(1)
 * 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。
 *      若opt=1,接下来两个整数x, y,表示set(x, y)
 *      若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1
 *      对于每个操作2,输出一个答案
 *
 * 示例1:
 * 输入
 *  [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3
 * 输出
 *  [1,-1]
 */
public class LRU {
    public int[] LRU (int[][] operators, int k) {
        // write code here
        List<Integer> list = new ArrayList<>();
        LRUCache lruCache = new LRUCache(k);
        for(int[] op: operators){
            if(op[0] == 1){
                lruCache.set(op[1], op[2]);
            }else if(op[0] == 2){
                list.add(lruCache.get(op[1]));
            }
        }
        int[] ans = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            ans[i] = list.get(i);
        }
        return ans;
    }
}

class LRUCache{
    /**
     * 双向链表
     */
    class LinkedNode{
        private int key;
        private int value;
        private LinkedNode prev;
        private LinkedNode next;
        public LinkedNode(){}

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

    /**
     * 保存头尾节点的指针,以便于在O(1)时间内进行去除链表尾,和新增节点到链表头
     */
    private LinkedNode head;
    private LinkedNode tail;
    /**
     * 保存key与node的映射,作为缓存表
     */
    private Map<Integer, LinkedNode> cache;
    /**
     * 定义缓存表的容量
     */
    private int capacity;

    public LRUCache(int k){
        this.cache = new HashMap<>();
        this.capacity = k;
        this.head = new LinkedNode();
        this.tail = new LinkedNode();
        this.head.next = this.tail;
        this.tail.prev = this.head;
    }

    /**
     * 添加节点到缓存中
     * 1.当缓存中没有对应的记录信息,则新建一个节点保存到缓存中,并将对应的节点放置到链表的头部
     * 2.当缓存中有对应的记录信息,更新记录节点的value,,并将该记录节点更新到链表的头部,表示该记录最近被使用
     * @param k
     * @param v
     */
    public void set(int k, int v){
        LinkedNode node = this.cache.get(k);
        if(node == null){
            node = new LinkedNode(k, v);
            this.cache.put(k, node);
            addToHead(node);
            if(this.cache.size() > this.capacity){
                LinkedNode tailNode = rmTailNode();
                this.cache.remove(tailNode.key);
            }
        }else{
            node.value = v;
            rmNodeToHead(node);
        }
    }

    /**
     * 通过key获取缓存信息
     * 并且需要更新该记录到链表的头部,表示该缓存记录最近被使用了
     * @param k
     * @return
     */
    public int get(int k){
        LinkedNode node = this.cache.get(k);
        if(node != null){
            rmNodeToHead(node);
        }
        return node == null ? -1 :node.value;
    }

    private void rmNodeToHead(LinkedNode node){
        rmNode(node);
        addToHead(node);
    }
    private void rmNode(LinkedNode node){
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    private void addToHead(LinkedNode node){
        node.next = this.head.next;
        this.head.next = node;
        node.prev = this.head;
        node.next.prev = node;
    }
    private LinkedNode rmTailNode(){
        LinkedNode node = this.tail.prev;
        rmNode(node);
        return node;
    }
}
医疗影像技术实战:如何用Python快速生成DRR图像(附完整代码) 本文详细介绍了如何使用Python实现数字重建放射影像的快速生成。通过实战代码,从基础光线投射算法到性能优化,逐步讲解DRR图像生成的核心原理与工程实践,帮助开发者掌握医疗影像处理的关键技术,赋能放射治疗规划与图像引导手术等临床工具开发。 阅读详情

相关推荐

别再为CAD和GIS数据对不上而头疼了!一份完整的ArcGIS for AutoCAD坐标系定义与数据套合指南

本文详细介绍了如何通过ArcGIS for AutoCAD插件解决CAD与GIS数据坐标系不匹配的问题,实现数据的精准套合。文章从坐标系冲突分析、插件核心功能解析到五步标准化工作流,提供了完整的解决方案,帮助工程师和设计师提升跨平台协作效率。

weixin_42531886的博客 216

每日一练之设计 LRU 缓存结构

设计 LRU 缓存结构 OJ 地址:设计 LRU 缓存结构 #include <unordered_map> class Solution { private: // 维护一个有序单向链表,当有一个新的数据被访问时,从链表头部开始遍历链表: // 1 如果此数据之前已经在缓存中了,那么将其从原来的位置删除,并将其插入到头节点 // 2 如果此数据之前不在缓存中: // 2.1 如果缓存未满,则直接将此节点插入到头节点 // 2.2 如果缓存已满

qq_41033011的博客 275

组合导航、惯导、GNSS、INS、IMU的区别

‌:惯性导航系统(INS)是一种利用安装在运载体上的陀螺仪和加速度计来测定运载体位置的系统。它通过测量物体的加速度和角速度,结合算法计算出物体的位置、速度和姿态‌12。‌。

wynn1123的博客 8048

牛客题解 | 设计LRU缓存结构

牛客题库题解

wc529065的博客 686

Voronoi算法构建多晶

孪晶多晶 采用孪晶的原子链作为种子通过voronoi算法可以得到孪晶多晶结构。 孪晶种子: txt文件不需要特殊设置 box 150 150 150 random 8 得到孪晶多晶: 通过改变孪晶种子的长度可以得到不同孪晶片层厚度的多晶。 准二维柱晶 所有晶粒在某一维度的晶向一致,晶粒仅在平面内具有旋转关系,所有晶界为旋转对称晶界,这种结构的多晶其位错滑移在某些方向受限,但是能极大的提高晶粒...

yamatachi的博客 5278

告别环境依赖!用PyInstaller把PaddleOCR项目打包成独立EXE(附完整spec文件配置)

本文详细介绍了如何使用PyInstaller将PaddleOCR项目打包成独立EXE文件,彻底解决Python环境依赖问题。通过完整的spec文件配置和实战技巧,开发者可以轻松创建开箱即用的OCR工具,特别适合需要交付给非技术用户的场景。文章涵盖环境配置、模型打包、性能优化等关键环节,并提供了解决常见问题的方案。

weixin_33712987的博客 573

设计一个LRU缓存结构

题意 题解 #include <unordered_map> struct DListNode{ int key, val; DListNode* next; DListNode* pre; DListNode(int key, int value): key(key), val(val), pre(nullptr), next(nullptr){} }; class DList{ private: DListNode* head; DListN

fkuner的博客 531

【异常】解决 Claude Code 及第三方插件提示 “API Error: 404“ 的配置修复指南

在使用 Claude 相关的 CLI 工具(如)或 IDE 插件进行开发辅助时,配置错误的模型参数是导致连接失败的常见原因。本文将针对这一典型报错进行复盘与解决。

奶爸的编程之路,也就一周冷个三天 7745

LRU缓存数据结构的设计

/ 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}std::cout << cache.get(1) << std::endl;// 缓存是 {1=1, 2=2}

qq_43583172的博客 933

电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?

DGND是数字地,是数字电路部分的公共基准端,用于连接数字电路的接地。

XU157303764的博客 2334

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

【牛客】设计LRU缓存结构

题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 要求 set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。 若opt=1,接下来两个整数x, y,表示set(x, y) 若opt=2,接下来一个整数x

qq1922631820的博客 262

【人工智能之深度学习】15. 工业时序预测实战:LSTM与TCN融合的装备故障预警系统设计与实现

摘要:工业装备故障预警是智能制造领域的核心技术之一,其通过分析传感器时序数据实现故障提前预测,可显著降低运维成本并提升设备可靠性。本文针对工业时序数据多源异构、非平稳性、噪声干扰及样本不平衡等挑战,提出一种LSTM与TCN融合的故障预警架构——利用TCN捕捉局部时序特征,结合注意力增强LSTM建模长期依赖关系,通过门控机制实现特征自适应融合。以3MW风电齿轮箱为研究对象,设计包含数据预处理、特征工程、模型训练及部署的完整流程,实验结果表明,该融合模型准确率达94.6%,故障预测提前量较单一模型提升30%以上

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1438

牛客网 | 高频面试题 | 设计LRU缓存结构

文章目录题目解析 题目 设计LRU缓存结构_牛客网 示例1 输入 [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3 返回值 [1,-1] 说明 第一次操作后:最常使用的记录为("1", 1) 第二次操作后:最常使用的记录为("2", 2),("1", 1)变为最不常用的 第三次操作后:最常使用的记录为("3", 2),("1", 1)还是最不常用的 第四次操作后:最常用的记录为("1", 1),("2", 2)变为最不常用的 第五次操作后:

我是一块小石头 285

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

牛客网:设计LRU缓存结构 设计LFU缓存结构

链表 数据结构 牛客网 C++

weixin_46266058的博客 983

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

设计LRU缓存结构[Java]

文章目录题目描述解题思路代码如下 题目描述 设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 提示: 1.某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的,然后都会刷新缓存。 2.当缓存的大小超过K时,移除最不经常使用的记录。 3.输入一个二维数组与K,二维数组每一维有2个或者3个数字,第1个数字为opt,第..

a13572259715的博客 303

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【数据结构-链表 八】【链表模拟】模拟设计LRU缓存结构

LRU(Least Recently Used)缓存结构是一种常见的缓存管理策略,用于在有限的缓存空间内存储最近被访问过的数据。该策略的基本思想是,当缓存空间已满并且需要插入新数据时,会优先淘汰掉最近最少被访问的数据,以便为新数据腾出空间。当某个数据被访问时,如果它已经在缓存中,那么它会被标记为最近被访问的数据,因此它会被移到缓存的队列头部(或者链表的头部)。当缓存空间已满并且需要插入新数据时,会淘汰掉队列尾部(或链表末尾)的数据,因为这些数据是最近最少被访问的。

MaoLin Tian's Blog 961
上一篇: 面试题 08.06. 汉诺塔问题
下一篇: TOP K问题(大顶堆、分治思想)
Lazy mode
博客等级 码龄10年 13粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值