《征服数据结构》LRU缓存

摘要:

1,LRU的介绍

2,LRU元素的添加

3,LRU元素的读取

4,LRU完整代码实现

1,LRU的介绍

LRU(Least Recently Used)最近最少使用,它是一种缓存淘汰策略。也就是说在缓存容量满的时候,我们需要删除一些元素,删除的原则就是越久没被使用的越容易被删除。

举个简单例子,比如你桌子上的书堆满了,需要拿掉一部分,你肯定是优先拿掉那些很久没有看的书,经常看的书肯定会优先留下来。

LRU要做的就是根据元素使用的时间来保持它们的顺序,维持相对顺序的数据结构使用的是双向链表。

如下图所示,最近被使用的元素会靠近链表头部,越久没被使用的元素越靠近尾部,删除的时候优先删除离尾部最近的元素,其中链表的头节点 head 和尾节点 tail 是不存储任何数据的。

我们先来看下链表的节点类,不熟悉双向链表的可以先看下前面讲的《双向链表》

Java 代码:

go 复制代码
// 双向链表的节点类
class LinkedNode {
    int key, val;// 节点的key和val值
    LinkedNode pre;// 指向前一个节点的指针
    LinkedNode next;// 指向后一个节点的指针
}

C++ 代码:

go 复制代码
// 双向链表的节点类
struct LinkedNode {
    int key, val;// 节点的key和val值
    LinkedNode *pre = nullptr;// 指向前一个节点的指针
    LinkedNode *next = nullptr;// 指向后一个节点的指针
};

2,LRU元素的添加

LRU中的元素是根据键值对存储在map中的,关于map的知识点可以看下前面的《散列表》,双向链表只是维护元素使用的时间顺序。

在添加的时候如果 key 值已经存在了,我们直接更新value值,更新完之后要把它重新插入到链表的前面,如下图所示。

添加的时候如果 key 值不存在,直接插入到链表的前面,如下图所示。

相关推荐
budingxiaomoli几秒前
优选算法-哈希表
数据结构·算法·散列表
平哥努力学习ing18 分钟前
线性表与链表(part 1)
数据结构·链表
wWYy.21 分钟前
详解redis(5):Gossiping 协议
数据库·redis·缓存
小龙报1 小时前
【C语言进阶数据结构与算法】LeetCode27 && LeetCode88顺序表练习:1.移除元素 2.合并两个有序数组
c语言·开发语言·数据结构·c++·算法·链表·visual studio
Script kid1 小时前
Redis(Remote Dictionary Server远程字典服务器)五种常见数据结构及常见用法和指令
服务器·数据结构·redis
范纹杉想快点毕业1 小时前
C语言查找算法对比分析
数据结构·算法
好奇龙猫1 小时前
【大学院-筆記試験練習:线性代数和数据结构(14)】
数据结构
Remember_9932 小时前
【数据结构】深入理解Map和Set:从搜索树到哈希表的完整解析
java·开发语言·数据结构·算法·leetcode·哈希算法·散列表
小北方城市网2 小时前
Redis 缓存设计与避坑实战:解决穿透 / 击穿 / 雪崩
java·大数据·数据库·redis·python·elasticsearch·缓存
TTGGGFF2 小时前
控制系统建模仿真(二):掌握控制系统设计的 MAD 流程与 MATLAB 基础运算
开发语言·数据结构·matlab