V

算法可视化

ZHEN
分享到微博分享到 XGitHub 仓库个人主页
学习工具算法复杂度速查算法学习路径
数据结构数组链表栈队列树堆哈希表图字典树并查集LRU 缓存跳表线段树B+ 树布隆过滤器树状数组
经典排序算法冒泡排序鸡尾酒排序双调排序选择排序插入排序二分插入排序希尔排序归并排序自顶向下归并快速排序三路快排双轴快排堆排序计数排序基数排序桶排序
图算法Dijkstra 最短路Kruskal 最小生成树Prim 最小生成树Bellman-Ford 最短路拓扑排序Floyd 多源最短路强连通分量2-SAT最大流二分图匹配LCA 倍增欧拉路径
动态规划编辑距离0-1 背包完全背包最长公共子序列最长递增子序列硬币找零方案数石子合并旅行商 TSP树形 DP数位 DP换根 DP
回溯与搜索N 皇后子集生成全排列组合总和迷宫寻路岛屿数量单词搜索数独A* 寻路
字符串KMP 字符串匹配Rabin-KarpBoyer-MooreManacher后缀数组LCP / height 数组AC 自动机Z 函数
数学与数论埃氏筛线性筛欧几里得算法快速幂扩展欧几里得中国剩余定理欧拉函数米勒-拉宾FFTPollard's Rho
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

LRU 缓存 Least Recently Used

数据结构 · 哈希表 + 双向链表的经典组合

什么是 LRU 缓存

缓存空间有限,满了就得淘汰一项。LRU(最近最少使用)的策略是:淘汰最久没被用过的那一项——刚用过的最该留着,最久没碰的最该走。

这里容量 4,缓存项按「最近使用」从左到右排:最左是刚用的(MRU),最右是最久没用的(LRU,下一个被淘汰)。get、put 只要碰到某一项,就把它挪到最前。试试 get 一个已有的键、put 一个新键、再把缓存 put 到满。

亲手试试
3
val 30
↑ 最近用
↑ 最久没用
2
val 20
↑ 最近用
↑ 最久没用
1
val 10
↑ 最近用
↑ 最久没用

容量 3/4

缓存按「最近使用」排:左=最近用,右=最久没用。get/put 试试。

怎么做到 get/put 都 O(1)?答案正是前面两种结构的组合:哈希表负责按 key O(1) 找到节点(见哈希那篇),双向链表负责 O(1) 把节点挪到最前、从最后淘汰(见链表的双向那节)。哈希定位 + 双链表调序,缺一不可——这也是它常被当面试题的原因。

LRU 在哪里用

操作系统:页面置换算法。
数据库 / Redis:缓冲池、内存淘汰策略。
CPU cache / 浏览器 / CDN:就近缓存最近访问的数据。
各类 LRU cache 库:限定内存的键值缓存。

它是「组合已有结构解决新问题」的典范——也为这趟数据结构之旅收个尾。