【面试题】手撕缓存LRU

设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能

  • put(key, value):将记录(key, value)插入该结构
  • get(key):返回key对应的value值

对于put(key, value)来说,我们需要考虑两部分:

  1. 如果缓存中存在,那么直接将缓存中对应的元素移动到缓存头部
  2. 如果缓存中不存在,那么把元素添加到缓存头部,如果此时缓存的大小超出了预先设定的值,那么则将缓存尾部的元素删除

对于get(key)来说,我们还是需要考虑两部分:

  1. 如果缓存中存在,那么返回该值,并且将这个值移动到缓存头部
  2. 如果缓存中不存在,那么返回-1

综上所述:对于一个LRU缓存来说,主要包含以下三种操作。

  1. 查找一个元素。
  2. 在缓存末尾删除一个元素。
  3. 在缓存头部添加一个元素。

所以,我们最容易想到的实现方式就是通过双端链表+哈希表来实现这个问题,最终实现代码如下:

class LRUCache {private HashMap<Integer,ListNode> cache;private int capacity;private ListNode head,tail;class ListNode{int key;int value;ListNode prev;ListNode next;public ListNode(){}public ListNode(int key,int value){this.key=key;this.value=value;}}public LRUCache(int capacity) {this.capacity =capacity;cache = new HashMap<>();head = new ListNode();tail = new ListNode();head.next = tail;tail.prev = head;}public int get(int key) {//首先判断一下是否存在keyListNode node = cache.get(key);if(node==null){return -1;}//如果存在,把缓存移动到头部,返回valuemoveToHead(node);return node.value;}public void put(int key, int value) {//判断是否存在ListNode node = cache.get(key);//如果不存在,添加到头部,如果容量到达上限,则删除队尾的元素,如果存在直接移动到头部if(node==null){ListNode newNode = new ListNode(key,value);cache.put(key,newNode);addNode(newNode);if(cache.size()>capacity){ListNode last  = popTail();cache.remove(last.key);}}else{node.value=value;moveToHead(node);}}public void addNode(ListNode node){node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}public void removeNode(ListNode node){ListNode prevNode = node.prev;ListNode NextNode = node.next;prevNode.next = NextNode;NextNode.prev = prevNode;}public void moveToHead(ListNode node){removeNode(node);addNode(node);}public ListNode popTail(){ListNode lastNode = tail.prev;removeNode(lastNode);return lastNode;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设计数据中心100G网络光纤布线

随着全球企业对带宽的需求呈指数级增长&#xff0c;数据中心需要升级以增强其计算、存储和网络能力。数据中心从10G/25G向100G迁移成为必然趋势。随着网络升级&#xff0c;数据中心的光纤布线系统也需要随之优化。本文将指导您如何设计数据中心100G网络光纤布线。 100G以太网的…

python-快速上手爬虫

目录 前言 爬虫需谨慎&#xff0c;切勿从入门到入狱&#xff01; 一点小小的准备工作 直接上手爬取网页 1.获取UA伪装 2.获取url 3.发送请求 4.获取数据并保存 总结 前言 爬虫需谨慎&#xff0c;切勿从入门到入狱&#xff01; 一点小小的准备工作 对pip进行换源&#xf…

libevent的event管理相关接口

目录 4. 事件管理4.1 event_new功能备注原型 4.2 event_free功能备注原型 4.3 event_debug_unassign功能 备注4.4 event_add功能&#xff1a;备注&#xff1a;原型&#xff1a; 4.5 event_del功能备注原型 4.6 event_base_once功能备注原型: 4.7 event_pending功能备注原型 4.8…

Censot7 使用 yum 报错:Could not resolve host: mirrorlist.centos.org

解决方案&#xff1a;替换成阿里的镜像地址。 1&#xff1a;先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2&#xff1a;新建一个文件 touch /etc/yum.repos.d/CentOS-Base.repo 3&#xff1a;在新文件里写入以下内容 [base] name…

基于微信小程序图书馆座位预约系统设计与实现

链接: 文档和工程文件地址: ** 2、未完待续:请到目标位置下载 ** 链接: 文档和工程文件地址:

分布式搜索之Elasticsearch入门

Elasticsearch 是什么 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心&#xff0c;它集中存储您的数据&#xff0c;帮助您发现意料之中以及意料之外的情况。 Elastic Stack 又是什么呢&a…

排序系列 之 快速排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想&#xff0c;即在一个无序的序列中选取一个任意的基准元素base&#xff0c;利用base将待排序的序列分…

【吊打面试官系列-ZooKeeper面试题】分布式集群中为什么会有 Master?

大家好&#xff0c;我是锋哥。今天分享关于 【分布式集群中为什么会有 Master&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 分布式集群中为什么会有 Master&#xff1f; 在分布式环境中&#xff0c;有些业务逻辑只需要集群中的某一台机器进行执行&#xff0c…

Leetcode1305.两颗二叉搜索树中的所有元素

1.题目要求: 给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表&#xff0c;其中包含 两棵树 中的所有整数并按 升序 排序。.2.思路: 我这个方法采用的是设立一个数组&#xff0c;然后用前序遍历把值存入数组中&#xff0c;然后用qsort给它排序 3.代码: /*** Definiti…

基本类型和包装类型的区别包装类型的缓存机制自动拆箱与自动装箱

基本类型和包装类型的区别是什么 存储方式&#xff1a;基本类型存储一般情况下储存在栈中&#xff08;这里指的是局部变量&#xff09;&#xff0c;而基本类型的成员变量比如类的属性&#xff0c;会存储在堆之中。而包装类型我们都知道是引用类型存储在堆内存之中。 占用空间&…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

蚂蚁集团推出EchoMimic:能通过音频和面部标志生成逼真的肖像动画视频

蚂蚁集团最近推出了一项名为EchoMimic的新技术。能通过音频和面部标志生成逼真的肖像动画视频&#xff0c;让你的声音和面部动作被完美复制到视频中&#xff0c;效果自然如照镜子。 EchoMimic不仅可以单独使用音频或面部标志点生成肖像视频&#xff0c;也可以将两者结合&#…

任意空间平面点云旋转投影至水平面—罗德里格旋转公式

1、背景介绍 将三维空间中位于任意平面上的点云数据&#xff0c;通过一系列的坐标变换&#xff08;平移旋转&#xff09;&#xff0c;使其投影到XOY平面上&#xff0c;同时保证点云的几何中心与XOY平面的原点重合&#xff0c;同时点云形状保持不变。具体效果如下&#xff0c;具…

Vue中如何封装接口

在Vue项目中封装接口通常是指将HTTP请求&#xff08;如GET、POST等&#xff09;封装成可复用的函数或方法&#xff0c;以便于在组件中方便地调用。这样的封装有助于减少代码重复&#xff0c;增强代码的可维护性和可读性。以下是一个基于Vue和Axios&#xff08;一个基于Promise的…

深入探究理解大型语言模型参数和内存需求

概述 大型语言模型 取得了显著进步。GPT-4、谷歌的 Gemini 和 Claude 3 等模型在功能和应用方面树立了新标准。这些模型不仅增强了文本生成和翻译&#xff0c;还在多模态处理方面开辟了新天地&#xff0c;将文本、图像、音频和视频输入结合起来&#xff0c;提供更全面的 AI 解…

MySQL MVCC原理

全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;主要是为了提高数据库的并发性能。 1、版本链 对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff1a; 1、trx_id&#xff1a;每次一个事务对某条…

vue-treeselect

一、属性及属性值 属性类型默认值用途allowClearingDisabledBooleanfalse是否允许重置值&#xff0c;即使有禁用的选定节点allowSelectingDisabledDescendantsBooleanfalse 当选择/取消选择祖先节点时&#xff0c;是否应选择/取消选中其禁用的后代 可与allowClearingDisabled道…

Harbor系列之1:介绍、架构及工作流程说明

Harbor介绍、架构及工作流程说明 Harbor 是一个用于存储、签名和扫描内容的企业级容器镜像注册表项目。由 VMware 开发并于 2016 年开源。Harbor 提供了一些关键特性&#xff0c;使其成为企业使用的理想选择。 1. Harbor 介绍 1.1 什么是 Harbor Harbor 是一个开源的云原生…

UDP网口(1)概述

文章目录 1.计算机网络知识在互联网中的应用2.认识FPGA实现UDP网口通信3.FPGA实现UDP网口通信的方案4.FPGA实现UDP网口文章安排5.传送门 1.计算机网络知识在互联网中的应用 以在浏览器中输入淘宝网为例&#xff0c;介绍数据在互联网是如何传输的。我们将要发送的数据包称作A&a…

cordova使用vue进行开发

使用vue框架进行cordova跨平台混合框架app开发&#xff0c;步骤如下&#xff1a; 1、使用cordova创建一个项目 2、使用vue创建一个项目 3、在vue项目的根目录创建一个vue.config.js文件&#xff08;如果有则不用再创建&#xff09;&#xff0c;vue.config.js的内容如下&…