概述
LRU(Least Recently Used,最近最少使用)算法是地址转换旁路缓冲储存器(TLB)中数据的更新策略。TLB中存储的是虚拟地址到物理地址的映射,可以避免CPU多次在内存中查找页表来将虚拟地址转换为物理地址的时间开销。TLB的容量是有限的,所以在我们存入新的数据且TLB中没有空余容量时应当踢出一些数据。而LRU算法的思想是踢出TLB中上次使用距今最久远的数据,即最近最少使用的数据。
例题
LeetCode 146. 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
,则应该 逐出 最久未使用的关键字。
示例:
1 | 输入 |
题解
因为要以 O(1)
的时间复杂度取得 key
对应的 value
,所以我们使用哈希表来储存数据。而要以 O(1)
的时间复杂度改变节点的数据,不难想到使用链表的数据结构。所以我们可以确认本题使用的数据结构是哈希表+链表,其中哈希表的键就是题目给的键,哈希表的值是我们自定义的Node类指针。
1 | struct Node { |
当我们查询或修改某一个节点时,我们应该将他移到链表的末尾。这样越靠近链表末尾的节点最后一次访问的时间离现在越近。当链表中的节点数到达容量值时,我们踢出链表的头节点,并将头节点的后一个节点设置为新的头节点。
1 | Node* curr = map[key]; |
完整代码
1 | class LRUCache { |
有的没的
今日最佳弔图
虽然我七选三没选物理,但是高三闲的没事的时候(正经人谁高三闲的没事啊)喜欢翻翻同桌的物理书,平时刷B站的时候也看过介绍相对论的视频,所以我能看懂这张图。太好玩儿了,哈哈!

开始学习操作系统了
上周一启动了操作系统的学习,学习资料是《操作系统导论》。今天是第九天,已经看了三百来页了,这应该是我大学以来有效阅读量最大的一段时间了吧。目前学到的知识可能还比较浅,有些地方囫囵吞枣地就过去了,以后还需要多多积累呀。这篇Blog也是在书上看到了LRU算法才想起来之前在LeetCode上好像写到过(后来发现写到过的应该是LFU,过两天也写成博客吧),才重新回去做了一遍写出来的。