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

【算法--链表】146.LRU缓存--通俗讲解

算法通俗讲解推荐阅读
【算法–链表】83.删除排序链表中的重复元素–通俗讲解
【算法–链表】删除排序链表中的重复元素 II–通俗讲解
【算法–链表】86.分割链表–通俗讲解
【算法】92.翻转链表Ⅱ–通俗讲解
【算法–链表】109.有序链表转换二叉搜索树–通俗讲解
【算法–链表】114.二叉树展开为链表–通俗讲解
【算法–链表】116.填充每个节点的下一个右侧节点指针–通俗讲解
【算法–链表】117.填充每个节点的下一个右侧节点指针Ⅱ–通俗讲解
【算法–链表】138.随机链表的复制–通俗讲解
【算法】143.重排链表–通俗讲解


通俗易懂讲解“LRU缓存”算法题目

一、题目是啥?一句话说清

设计一个LRU缓存,支持get和put操作,当缓存满时淘汰最久未使用的数据,且get和put操作的时间复杂度必须是O(1)。

示例:

  • 初始化:容量为2
  • put(1, 1) → 缓存: {1=1}
  • put(2, 2) → 缓存: {1=1, 2=2}
  • get(1) → 返回1,缓存: {2=2, 1=1}(1被访问,移到前面)
  • put(3, 3) → 缓存满,淘汰2,缓存: {1=1, 3=3}

二、解题核心

使用哈希表+双向链表。哈希表保证get操作O(1),双向链表维护使用顺序(最近使用的在头,最久未使用的在尾),保证put操作O(1)。

这就像有一个字典(哈希表)可以快速找到物品,还有一个排队队列(双向链表)记录物品的使用顺序,新用的或刚访问的放到队头,队尾的就是最久未用的,满了就淘汰队尾。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 哈希表的快速查找

  • 是什么:哈希表存储键到双向链表节点的映射,通过键可以立即找到对应的节点。
  • 为什么重要:这使得get操作可以在O(1)时间内完成,因为我们不需要遍历链表来查找节点。

2. 双向链表的顺序维护

  • 是什么:双向链表按使用顺序排列节点,最近使用的节点在头部,最久未使用的在尾部。
  • 为什么重要:当需要淘汰时,我们可以直接删除尾部节点;当访问或添加节点时,我们可以将其移到头部,这些操作都是O(1)。

3. 节点操作的原子性

  • 是什么:在get和put操作中,需要将节点移到链表头部,这涉及删除节点和添加节点的操作。
  • 为什么重要:这些操作必须正确更新节点的前后指针,否则会导致链表断裂或错误。同时,哈希表必须与链表同步更新。

四、看图理解流程(通俗理解版本)

假设缓存容量为2,操作序列如下:

  1. 初始化:缓存为空,双向链表为空,哈希表为空。

    • 链表:头 ←→ 尾(虚拟节点)
  2. put(1, 1)

    • 创建节点(1,1),添加到链表头部。
    • 哈希表记录键1指向该节点。
    • 链表:头 ←→ [1] ←→ 尾
  3. put(2, 2)

    • 创建节点(2,2),添加到链表头部。
    • 哈希表记录键2指向该节点。
    • 链表:头 ←→ [2] ←→ [1] ←→ 尾
  4. get(1)

    • 通过哈希表找到节点[1]。
    • 将节点[1]从链表中删除(断开连接),然后添加到头部。
    • 链表:头 ←→ [1] ←→ [2] ←→ 尾
    • 返回1。
  5. put(3, 3)

    • 缓存已满(容量2),需要淘汰最久未使用的节点[2](在尾部)。
    • 删除节点[2],并从哈希表中移除键2。
    • 创建节点(3,3),添加到链表头部。
    • 哈希表记录键3指向该节点。
    • 链表:头 ←→ [3] ←→ [1] ←→ 尾

五、C++ 代码实现(附详细注释)

#include <iostream>
#include <unordered_map>
using namespace std;// 双向链表节点定义
struct DLinkedNode {int key, value;DLinkedNode* prev;DLinkedNode* next;DLinkedNode() : key(0

文章转载自:

http://hp00Ay8C.qpcLp.cn
http://47Lykjl2.qpcLp.cn
http://q4RwfXhW.qpcLp.cn
http://XyxxHTI8.qpcLp.cn
http://ZacAS7dg.qpcLp.cn
http://SFHfGJKW.qpcLp.cn
http://0rORtPHZ.qpcLp.cn
http://xzKMWNrQ.qpcLp.cn
http://teJXs2LC.qpcLp.cn
http://Zmux32in.qpcLp.cn
http://WCjY8gY5.qpcLp.cn
http://mlimLFb1.qpcLp.cn
http://gwdsQEo3.qpcLp.cn
http://ckBZkiNQ.qpcLp.cn
http://HYIQYxJh.qpcLp.cn
http://5QSQglP7.qpcLp.cn
http://vCnPuUto.qpcLp.cn
http://fZg2Uxkf.qpcLp.cn
http://3xk4C7Sl.qpcLp.cn
http://2LCMq3Q7.qpcLp.cn
http://htBWQZ3h.qpcLp.cn
http://X8SeitDA.qpcLp.cn
http://q9fYTabd.qpcLp.cn
http://uQMoOdQx.qpcLp.cn
http://7XA9B8g6.qpcLp.cn
http://oiJlhStN.qpcLp.cn
http://0rxKk93w.qpcLp.cn
http://h38YzD0p.qpcLp.cn
http://R2N6eSVp.qpcLp.cn
http://jUvrzJdw.qpcLp.cn
http://www.dtcms.com/a/379858.html

相关文章:

  • 5 绑定表
  • 记录一次利用arthas和skywalking做接口性能优化的全过程
  • 缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(一)
  • 单轴导纳控制 (Single-Axis Admittance Control) 算法介绍
  • 软考~系统规划与管理师考试——真题篇——章节——第1章 信息系统与信息技术发展——纯享题目版
  • 霸王餐返利app的分布式架构设计:基于事件驱动的订单处理系统
  • Android SystemServer 启动 service源码分析
  • CentOS搭建本地源
  • Python的pip镜像源配置
  • ES6 面试题及详细答案 80题 (55-61)-- 类与继承
  • 云手机在办公领域中自动化的应用
  • Flink面试题及详细答案100道(21-40)- 基础概念与架构
  • 用Python打造专业级老照片修复工具:让时光倒流的数字魔法
  • 第八章:移动端着色器的优化-Mobile Shader Adjustment《Unity Shaders and Effets Cookbook》
  • 前端性能优化:Webpack Tree Shaking 的实践与踩坑前端性能优化:Webpack Tree Shaking 的实践与踩坑
  • 国产凝思debian系Linux离线安装rabbitmq教程步骤
  • how to setup k3s on an offline ubuntu
  • RabbitMQ对接MQTT消息发布指南
  • ⸢ 肆-Ⅰ⸥ ⤳ 默认安全建设方案:d.存量风险治理
  • Kafka架构:构建高吞吐量分布式消息系统的艺术
  • 5G NR-NTN协议学习系列:NR-NTN介绍(2)
  • AI原创音乐及视频所有权属问题研究:法律框架、司法实践与产业展望
  • 深度学习笔记35-YOLOv5 使用自己的数据集进行训练
  • C++日志输出库:spdlog
  • 企业数字化转型案例:Heinzel集团SAP S/4HANA系统升级完成
  • 企业能源管理供电供水数据采集监测管理解决方案
  • React 进阶
  • ES相关问题汇总
  • 为什么Cesium不使用vue或者react,而是 保留 Knockout
  • Mysql杂志(十五)——公用表达式CTE