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

Leetcode 146. LRU 缓存 哈希表 + 双向链表

原题链接:Leetcode 146. LRU 缓存

在这里插入图片描述
在这里插入图片描述

LRU(Least Recently Used,最近最少使用)缓存是一种内存数据管理策略,核心思想是:当缓存空间满时,优先淘汰 “最近一段时间内最少被访问” 的数据,为新数据腾出空间。它的设计目标是利用 “局部性原理”(程序或用户访问数据时,往往会在短时间内重复访问同一批数据),尽可能保留高频访问的数据,从而减少对底层存储(如数据库、硬盘)的依赖,提升数据读取效率。

LRU 的行为围绕 “访问” 和 “淘汰” 两个关键场景展开:

  • 数据访问时(读 / 写):
    • 若数据已在缓存中(“命中”),则将其标记为 “最近使用过”(更新它的访问优先级,避免被优先淘汰);
    • 若数据不在缓存中(“未命中”),则将其存入缓存;若缓存已满,先淘汰 “最久未访问” 的数据,再存入新数据。
  • 缓存满时淘汰:
    严格选择 “最近一段时间内没有被访问过” 或 “访问频率最低” 的数据进行删除。

LRU 的高效实现需要满足两个核心需求:

  • 快速查找数据(判断是否在缓存中)
  • 快速更新 / 删除数据(调整访问优先级、淘汰旧数据)
  • 经典实现采用 “哈希表 + 双向链表” 的组合

代码参考官解:LRU缓存机制

// 设计一个双向链表结构体
struct Node{int key,value;Node* prev;Node* next;Node():key(0),value(0),prev(nullptr),next(nullptr) {};Node(int k,int v):key(k),value(v),prev(nullptr),next(nullptr) {};
};class LRUCache {
private:int size;int capacity;Node* head;Node* tail;unordered_map<int,Node*> cache;
public:LRUCache(int _capacity): capacity(_capacity),size(0) {head = new Node();tail = new Node();head->next = tail;tail->prev = head;}int get(int key) {// 如果在当前缓存内没有找到if(!cache.count(key)){return -1;}// 如果找到Node* node = cache[key];move_to_head(node);return node->value;}void put(int key, int value) {// 如果在当前缓存内没有找到if(!cache.count(key)){// 如果 key 不存在,创建一个新的节点Node* node = new Node(key,value);// 添加进哈希表cache[key]=node;size++;// 添加至双向链表的头部add_to_head(node);if(size>capacity){// 如果超出容量,删除双向链表的尾部节点Node* drop_node = remove_tail();// 删除哈希表中对应的项cache.erase(drop_node->key);// 防止内存泄漏delete drop_node;size--;}}//如果当前缓存中有else{// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部Node* node = cache[key];node->value = value;move_to_head(node);}}void add_to_head(Node* node){node->prev = head;node->next = head->next;head->next->prev = node;head->next = node;}void remove_node(Node* node){node->prev->next = node->next;node->next->prev = node->prev;}void move_to_head(Node* node){remove_node(node);add_to_head(node);}Node* remove_tail(){Node* node = tail->prev;remove_node(node);return node;}};/*** 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);*/
http://www.dtcms.com/a/405761.html

相关文章:

  • VideollaMA 3论文阅读
  • Android 14 系统 ANR (Application Not Responding) 深度分析与解决指南
  • 《红色脉络:一部PLMN在中国的演进史诗 (1G-6G)》 第11篇 | 核心网演进终局:从EPC到5GC——微服务与“云原生”
  • k8s中的NetworkPolicy
  • 【大语言模型】大模型后训练入门指南
  • 【初学】使用 node 编写 MCP Server
  • 阿里云云原生挑战官方用例SPL
  • 销售管理软件免费版什么叫seo优化
  • Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案
  • 咨询顾问进阶——146页PPT详解麦肯锡-企业管理整合咨询-组织设计方案【附全文阅读】
  • 力扣995. K 连续位的最小翻转次数
  • Resources$NotFoundException
  • pg下使用 TimescaleDB并创建1亿数据
  • 自动化脚本的操作逻辑与实现
  • UVa12418 Game of 999
  • 基于51单片机的音乐弹奏系统
  • 负载均衡式的在线OJ项目编写(二)
  • 美篇在哪个网站做的外链代发工具
  • Linux高级技巧之集群部署(七)
  • 外贸做那种网站wordpress获取图片的绝对地址
  • 【自然语言处理与大模型】RAFT(Retrieval Augmented Fine Tuning)方法
  • 湖南网站建设公司 找磐石网络一流跨境电商平台app排名
  • 动态IP使用中 报错407 怎么办???
  • 手机百度建设网站台州企业网站建设
  • 鞍山网站建设制作新潮远网站建设
  • 网站友情链接的好处东莞专业微网站建设
  • 二级学院英语网站建设通知wordpress login网址
  • 计算机专业大学排名seo统计
  • 织梦网站怎么加入引导页成都最值得一去的地方
  • 手机网站需要什么c 网站开发需要学什么