(每天学一道)力扣算法:146题LRU缓存机制

简介: (每天学一道)力扣算法:146题LRU缓存机制(Least Recently Used)

(每天学一道)力扣算法:146题LRU缓存机制(Least Recently Used)


运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。

实现 LRUCache 类:

•LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

•int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

•void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?

 

1,解题思路(关键字、关键句)

(1)读题得关键信息:容量、get(key)、put(key, value);  写入数据前,容量上限,删除最久未使用数据值,从而腾出空间,最后 O(1):

get(key)、put(key, value)、容量-----联想到键值对的容器,map家族中找。

O(1)--------------------------------------------锁定容器是~哈希表。

▪到这里只用hashMap,只可以往里放键值put,跟从里边取出来值,但是删除规则:写入新数据前先删除比较久未使用后腾出空间来。

 

(2)非常隐蔽的线索是咱存放数据需要有先后的规律,才可以使得取数据,删除数据有规律~例如咱把最新使用的数据放在最前面位置,后边的数据就是比较久的数据~

而hashMap无法满足此隐蔽的规律,因为hashMap存数据是无序的,咱需要再找到一个存取有先后规律的容器对于有出入问题顺序的容器-----栈、队列、链表

(这里咱选择链表,理由:考虑到O(1)的时间要求,因为栈、队列的操作结点要么是头结点、尾结点的,可是这里咱有可能会出现key的结点在中间位置,不在头尾处,

导致时间不满足O(1)。(链表特点:快速移动结点的位置。))

 

综上,容器:双向链表+hashMap(实现O(1))


42.png


43.png


2,本题难点:访问get、插入put时间先后顺序、O(1)时间复杂度

题目要求get、put,更新数据后,该数据需要被设置为最新访问数据,所以需要:

①需要随机访问 ~ 哈希表实现时间复杂度O(1)的随机访问。

②需要把该数据插入到头部或者尾部~双向链表

 

3,代码实现:

3-1,双向链表结点类(内部类)

44.png


3-2,辅助变量:HashMap、容器大小capacity、size、头结点、尾结点


46.png


3-3,题意:•LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

所以咱的构造方法:参数是capacity+顺便初始化一下咱的辅助变量。(其中要结点的指针指向也需要初始化。)

47.png


3-4,题意:•int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

缓存结构:双链表+哈希表,值在双向链表的结点里,而咱是通过哈希表键值对(key,value~结点位置),所以需要先通过哈希表get(key)获得结点,

然后判断是否为空,空返回-1,否则要返回值啦,注意返回值前先挪结点到头结点位置哈)

(要注意细节:get过的结点就是最新使用的结点啦!要把它移动到头结点的位置。)


48.png


3-5,题意:•void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,

它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。


49.png


50.png




目录
相关文章
|
6月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
154 2
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
6月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
282 0
|
7月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1364 0
|
5月前
|
缓存 人工智能 算法
lru算法设计与实现
本文详细介绍了LRU(Least Recently Used,最近最少使用)缓存淘汰策略的原理与实现。LRU的核心思想是:越近被访问的数据,未来被再次访问的可能性越大。文章通过Java语言实现了一个支持O(1)时间复杂度操作的LRU缓存
238 0
|
7月前
|
缓存 NoSQL Go
【LeetCode 热题100】146:LRU 缓存(详细解析)(Go语言版)
本文详细解析了力扣 146 题——LRU 缓存机制的实现方法。通过结合哈希表与双向链表,确保 `get` 和 `put` 操作均在 O(1) 时间内完成。哈希表用于快速查找,双向链表记录访问顺序,支持最近使用数据的高效更新与淘汰。代码以 Go 语言实现,结构清晰,涵盖核心操作如节点移动、插入与删除。此题为面试高频考点,适用于数据缓存、页面置换等场景,掌握后可加深对缓存策略的理解。
374 4
|
8月前
|
存储 监控 算法
基于 PHP 二叉搜索树算法的内网行为管理机制探究
在当今数字化网络环境中,内网行为管理对于企业网络安全及高效运营具有至关重要的意义。它涵盖对企业内部网络中各类行为的监测、分析与管控。在内网行为管理技术体系里,算法与数据结构扮演着核心角色。本文将深入探究 PHP 语言中的二叉搜索树算法于内网行为管理中的应用。
108 4
|
7月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
138 0
|
9月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
180 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
9月前
|
存储 缓存 分布式计算
【赵渝强老师】Spark RDD的缓存机制
Spark RDD通过`persist`或`cache`方法可将计算结果缓存,但并非立即生效,而是在触发action时才缓存到内存中供重用。`cache`方法实际调用了`persist(StorageLevel.MEMORY_ONLY)`。RDD缓存可能因内存不足被删除,建议结合检查点机制保证容错。示例中,读取大文件并多次调用`count`,使用缓存后执行效率显著提升,最后一次计算仅耗时98ms。
231 0
【赵渝强老师】Spark RDD的缓存机制

热门文章

最新文章