当前位置: 首页 > news >正文

【算法】LRU缓存

难度:中等

题目:

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例:

输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

提示:

1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 105
最多调用 2 * 105 次 get 和 put

解题思路:

要实现LRU缓存,我们可以使用哈希表(在JavaScript中是对象或Map)和双向链表来完成。双向链表用于存储缓存项,确保插入、删除操作的高效性,而哈希表用于快速查找缓存项在链表中的位置。

1、数据结构选择

  • 哈希表:快速查找键值对,时间复杂度O(1)。
  • 双向链表:快速在头部添加和尾部删除元素,符合LRU特性。

2、实现逻辑

  • get(key)操作:如果key存在于哈希表中,将对应节点移到链表头部,并返回其值;否则返回-1。
  • put(key, value)操作:如果key已存在,更新其值并移到链表头部;如果key不存在且缓存已满,删除链表尾部节点(即最久未使用的项),然后在链表头部插入新的key-value对。

JavaScript实现:

class Node {constructor(key, value) {this.key = key;this.value = value;this.prev = null;this.next = null;}
}
class LRUCache {constructor(capacity) {this.capacity = capacity;this.hash = new Map(); // 用于快速查找this.head = new Node(); // 链表头节点,不存储数据this.tail = new Node(); // 链表尾节点,不存储数据this.head.next = this.tail;this.tail.prev = this.head;}get(key) {if (this.hash.has(key)) {const node = this.hash.get(key);this.moveToHead(node); // 将访问的节点移到链表头部return node.value;}return -1;}put(key, value) {if (this.hash.has(key)) {const node = this.hash.get(key);node.value = value; // 更新值this.moveToHead(node); // 移到头部} else {const newNode = new Node(key, value);this.hash.set(key, newNode);this.addToHead(newNode); // 插入到头部if (this.hash.size > this.capacity) {// 超出容量,删除尾部节点const removedNode = this.removeTail();this.hash.delete(removedNode.key);}}}// 移动到头部moveToHead(node) {this.removeNode(node);this.addToHead(node);}// 添加到头部addToHead(node) {node.prev = this.head;node.next = this.head.next;this.head.next.prev = node;this.head.next = node;}// 移除节点removeNode(node) {// 使用双列表的删除方法node.prev.next = node.next;node.next.prev = node.prev;}// removeTail() {const removedNode = this.tail.prev;this.removeNode(removedNode);return removedNode;}
}

这段代码首先定义了一个Node类来表示缓存中的每一个键值对,包含了指向前后节点的指针。LRUCache类则实现了LRU缓存的所有功能,包括使用哈希表快速查找,以及通过双向链表来维护元素的使用顺序。get和put方法均能在平均时间复杂度O(1)内完成操作。

双链表的数据结构如下图:
请添加图片描述
请添加图片描述

相关文章:

【算法】LRU缓存

难度&#xff1a;中等 题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;…...

解决elementUI列表的疑难杂症,排序显示错乱的问题

大家好&#xff0c;在使用elementUI表格时&#xff0c;有时会出现一些意料之外的问题&#xff0c;比如数据排序正常但表格显示、排序错乱等。在网上搜索后一般有2种解决方法&#xff1a;1.给表格每一项的el-table-column添加唯一的id用于区分。2.给表格每一项的el-table-column…...

重大消息:手机车机互联投屏专题发布-千里马带你学框架

背景&#xff1a; android投屏的使用场景以前在新能源车机还没火爆时候&#xff0c;大部分停留在手机小屏幕投屏到大屏幕的情况及整个多端设备的互动&#xff0c;整体需求和技术发展其实也就是比较有限&#xff0c;但是新能源车机火爆后&#xff0c;那么这种手机和车机互联互动…...

jail子系统里升级Ubuntu focal到jammy

Ubuntu focal是20.04 &#xff0c;jammy版本是22.04&#xff0c;本次的目的就是将FreeBSD jail子系统里的Ubuntu 从20.04升级到22.04 。这个focal 子系统是通过cbsd克隆得到的。使用CBSD克隆复制Ubuntu jail子系统环境-CSDN博客 do-release-upgrade升级没成功&#xff0c;用de…...

2024年7月20日(星期六)骑行支里山

2024年7月20日 (星期六&#xff09;骑行支里山&#xff0c;早8:00到8:30&#xff0c;大观公园门口集合&#xff0c;9:00准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门口集合 &#xff0c;家住东&#xff0c;南&#xff0c;北…...

Python:正则表达式相关整理

最近因为一些原因频繁使用正则表达式&#xff0c;因为以前系统整理过关于正则表达式的相关知识&#xff0c;所以这里仅记录使用期间遇到的问题。 本文内容基于re包 1. match和search方法的区别 在Python中&#xff0c;re.search和re.match都是用于匹配字符串的正则表达式函数&a…...

ChatGPT对话:有关花卉数据集

【编者按】编者准备研究基于深度学习的花卉识别&#xff0c;首先需要花卉数据集。 后续&#xff0c;编者不断会记录研究花卉识别过程中的技术知识&#xff0c;敬请围观 1问&#xff1a;推荐一下用于深度学习的花卉数据集 ChatGPT 以下是一些用于深度学习的优秀花卉数据集&am…...

特征向量及算法

数据挖掘流程 加载数据 把需要的模型数据先计算出来 特征工程 提取数据特征&#xff0c;对特征数据进行清洗转化 数据的筛选和清洗数据转化 类型转为 性别 男&#xff0c;女 ----> 1,0特征交叉 性别/职业/收入 —> 新特这 优质男性程序员 将多个特征值组合在一起特征筛选…...

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在类的层次结构中进行安全的向上转换&#xff08;从派生类到基类&#xff09;或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换&#xff08;即从派生…...

MySQL字符串魔法:拼接、截取、替换与定位的艺术

在数据的世界里&#xff0c;MySQL作为一把强大的数据处理利剑&#xff0c;其字符串处理功能犹如魔术师手中的魔法棒&#xff0c;让数据变换自如。今天&#xff0c;我们就来一场关于MySQL字符串拼接、截取、替换以及查找位置的奇幻之旅&#xff0c;揭开这些操作的神秘面纱。 介绍…...

在 Windows 上开发.NET MAUI 应用_1.安装开发环境

开发跨平台的本机 .NET Multi-platform App UI (.NET MAUI) 应用需要 Visual Studio 2022 17.8 或更高版本&#xff0c;或者具有 .NET MAUI 扩展的最新 Visual Studio Code。要开始在 Windows 上开发本机跨平台 .NET MAUI 应用&#xff0c;请按照安装步骤安装 Visual Studio 20…...

深度学习驱动智能超材料设计与应用

在深度学习与超材料融合的背景下&#xff0c;不仅提高了设计的效率和质量&#xff0c;还为实现定制化和精准化的治疗提供了可能&#xff0c;展现了在材料科学领域的巨大潜力。深度学习可以帮助实现超材料结构参数的优化、电磁响应的预测、拓扑结构的自动设计、相位的预测及结构…...

Netty UDP

Netty在UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;通信中的应用非常广泛&#xff0c;特别是在对实时性要求较高、对数据准确性要求相对较低的场景中&#xff0c;如视频传输、语音通信等。以下是对Netty在UDP通信中的详细解析&#xff1a; …...

Spring Framework各种jar包官网下载2024年最新下载官方渠道。

Spring其实就是一个大家族&#xff0c;它包含了Spring Framework&#xff0c;Spring Boot等一系列技术&#xff0c;它其实就是由许许多多的jar包构成&#xff0c;我们要使用Spring的框架&#xff0c;就要去下载支持这个框架的jar包即可。 1.官网下载Spring Framework的jar包 官…...

【Unity】RPG2D龙城纷争(十三)升级系统

更新日期:2024年7月16日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、升级系统数据集1.升级公式2.获得经验值公式3.预览所有等级经验值二、为关卡配置升级系统三、玩家角色获得经验事件四、玩家角色升级事件五、计算玩家角色获得经验值六、计算玩家角色是…...

保障低压设备安全!中国星坤连接器精密工艺解析!

在现代电子设备中&#xff0c;连接器扮演着至关重要的角色&#xff0c;它们是电子系统之间沟通的桥梁。随着技术的发展&#xff0c;对连接器的需求也在不断提升&#xff0c;特别是在低电压应用领域。中国星坤最新推出的低压连接器&#xff0c;以其精密性和安全性&#xff0c;为…...

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…...

SPring Boot整合第三方框架

springboot整合第三方框架 1. 整合mybatis 1.1引入依赖——pom.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…...

读取sqlserver数据库中varbinary(max)类型的内容,并将图片信息显示在前端页面

目录 1.varbinary(max)的说明 2.图片显示 3.总结 1.varbinary(max)的说明 varbinary(max) 是一种SQL Server数据库字段类型&#xff0c;用于存储二进制数据&#xff0c;可以存储最大长度的二进制数据。以下是关于 varbinary(max) 的说明&#xff1a; 存储容量: 可以存储最大…...

orcad导出pdf 缺少title block

在OrCAD中导出PDF时没有Title Block 最后确认问题在这里&#xff1a; 要勾选上Title Block Visible下面的print...

Rainglow主题精选:程序员必备的15个最佳配色方案

Rainglow主题精选&#xff1a;程序员必备的15个最佳配色方案 【免费下载链接】jetbrains 320 color themes for JetBrains IDEs including PHPStorm, Webstorm and more. 项目地址: https://gitcode.com/gh_mirrors/je/jetbrains Rainglow Color Schemes是一款为JetBrai…...

长期使用 Taotoken 后对账单追溯与成本分析的实际体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用 Taotoken 后对账单追溯与成本分析的实际体验 在项目开发中引入大模型能力后&#xff0c;成本控制与资源优化是团队负责人…...

HarmonyOS APP<<古今职鉴定>>开源教程第20篇:农历日期与节日计算

本篇学习农历算法&#xff0c;实现年俗内容的日期驱动图&#xff1a;农历日期与节日计算 的关键流程与实现要点。 学习目标 完成本篇后&#xff0c;你将能够&#xff1a; ✅ 理解农历算法原理✅ 实现公历转农历✅ 计算传统节日✅ 实现年俗日期匹配 预计学习时间 约 90 分钟…...

告别混乱搜索:Visual Paradigm 17.0 企业模型查找器(Enterprise Model Finder)深度使用指南

Visual Paradigm 17.0企业级模型检索革命&#xff1a;从精准定位到团队协作的全链路优化 在大型软件工程或复杂系统设计项目中&#xff0c;建模师们常常陷入"模型迷宫"的困境——当项目积累到数百个UML图、上千个业务流程图时&#xff0c;找到一个特定类定义或流程节…...

游戏开发团队必须立即升级的语音合成栈:Llama-3-TTS开源模型实测对比(RTX 4090 vs. Snapdragon 8 Gen3)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI语音合成在游戏开发中的应用 AI语音合成&#xff08;Text-to-Speech, TTS&#xff09;正深刻重塑游戏叙事、角色交互与本地化工作流。相比传统预录语音&#xff0c;实时TTS可动态生成符合上下文语境、情绪状…...

提示词失效?图像模糊?边缘锯齿?,深度拆解Midjourney毛玻璃效果的3大渲染瓶颈与实时修复路径

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Midjourney毛玻璃效果的本质与视觉语义定位 毛玻璃效果&#xff08;Frosted Glass Effect&#xff09;在 Midjourney 中并非原生支持的渲染模式&#xff0c;而是用户通过提示词工程、风格化参数与后期语义引导…...

多模态模型中图像生成器使用的扩散模型的组件

多模态模型中图像生成器使用的扩散模型组件 多模态模型中的图像生成器&#xff0c;通常不是一个单独网络&#xff0c;而是一套 条件扩散生成系统。典型输入是文本、图像、mask、bbox、姿态、深度图、边缘图、语义图、视频帧或多模态 embedding&#xff0c;输出是目标图像。 最常…...

【紧急更新】Midjourney 6.3毛发引擎重大变更!旧版Prompt失效预警+4套即插即用迁移方案(含兼容性检测脚本)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Midjourney 6.3毛发引擎重大变更全景速览 Midjourney v6.3 引入了全新重构的毛发渲染子系统&#xff08;Fur Rendering Engine&#xff09;&#xff0c;标志着其在生物细节生成能力上的关键跃迁。该引擎不再依…...

Onekey Steam清单下载工具:快速获取游戏清单的完整指南

Onekey Steam清单下载工具&#xff1a;快速获取游戏清单的完整指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey是一款专业的开源Steam Depot清单下载工具&#xff0c;能够直接连接Ste…...

openpilot深度解析:开源驾驶辅助系统的技术实现与架构设计

openpilot深度解析&#xff1a;开源驾驶辅助系统的技术实现与架构设计 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Tre…...