如何基于链表实现 LRU 缓存淘汰算法?
什么是LRU
LRU(Least recently
used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
我们维护一个有序单链表
,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。
如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。
如果此数据没有在缓存链表中,又可以分为两种情况:
如果此时缓存未满,则将此结点直接插入到链表的头部;
如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。
这样我们就用链表实现了一个 LRU 缓存,是不是很简单?
现在我们来看下缓存访问的时间复杂度是多少。因为不管缓存有没有满,我们都需要遍历一遍链表,所以这种基于链表的实现思路,缓存访问的时间复杂度为 O(n)。
实际上,我们可以继续优化这个实现思路,比如引入散列表(Hash table)来记录每个数据的位置,将缓存访问的时间复杂度降到 O(1)。因为要涉及我们还没有讲到的数据结构,所以这个优化方案,我现在就不详细说了,等讲到散列表的时候,我会再拿出来讲。
除了基于链表的实现思路,实际上还可以用数组来实现 LRU 缓存淘汰策略。如何利用数组实现 LRU 缓存淘汰策略呢?我把这个问题留给你思考
总结
- 新数据插入到链表头部
- 最近访问的数据移动到链表头部
如何基于链表实现 LRU 缓存淘汰算法?相关推荐
- 06 | 链表(上):如何实现LRU缓存淘汰算法?
缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...
- 看动画轻松理解「链表」实现「LRU缓存淘汰算法」
作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...
- 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」
作者 | 吴至波 责编 | 胡巍巍 快速挑战Python全栈工程师: https://edu.csdn.net/topic/python115?utm_source=csdn_bw 前几节学习了「链表 ...
- 看动画理解「链表」实现LRU缓存淘汰算法
前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...
- 算法必知 --- LRU缓存淘汰算法
作者:_code_x 链接:https://www.jianshu.com/p/b7fed77324b9 写在前 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾 ...
- 数据结构与算法 / LRU 缓存淘汰算法
一.诞生原因 缓存是一种提供数据读取性能的技术,在硬件设计.软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等.但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即: ...
- LRU缓存淘汰算法优化
上文中提到了LRU 缓存淘汰算法,可以帮助我们更好更合理的去使用缓存.但是它也有一个缺点就是如果有一些不满足"如果数据最近被访问过,那么将来被访问的几率也更高"的规律时,会破坏缓存 ...
- leetcode刷题:LRU缓存淘汰算法
题目: 分析: 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用.那么, ...
- 广义表head tail 运算_双链表实现LRU缓存淘汰策略
1.背景 LRU(Least Recently Used)是一种常用的缓存淘汰策略,即当缓存满了之后,删除最近最少使用的数据. LRU的实现,常用的编程语言在语言层面都有实现,可以直接使用.为了深入理 ...
最新文章
- 图书借阅系统java_基于JAVAWEB的图书借阅系统
- NYOJ 496 巡回赛 拓扑排序
- BZOJ 2282 树的直径
- 神秘大三角(判断点与三角形的关系)
- python3.7 ‘utf-8‘ codec can‘t decode byte 0xbe in position 0: invalid start byte
- AT1981-[AGC001C]Shorten Diameter
- docker之基础命令相关操作上
- JavaSE基础——数组概述和定义格式说明
- AJAX 数据库实例
- 关闭VS2019和VAssistX的导航栏
- JDK1.6官方下载_JDK6官方下载
- 三维地震数据segy数据显示
- wmic冻结进程_WMIC的用法
- 在心中刻上你的名字,让思念如烟
- 【初识数据结构】手把手教会你时间复杂度的计算方法
- 2023年,我觉得拼夕夕值得去
- 以太坊区块同步成功标志
- WIN10 连接 BOSE QC35 蓝牙耳机时断时续问题
- 【滴水逆向笔记】C语言结构体
- Vue+SpringBoot+ElementUI实战学生管理系统-10.学生管理模块
热门文章
- mysql 将select结果导出文件 linux
- 基础02Random类、ArrayList类
- Python求梅森尼数
- ngnix学习(二)ngnix常用命令
- cesium 加载科技感
- mysql jpa默认值_Spring JPA-枚举中枚举字段的默认值
- qtreewidgetitem 选中背景颜色_列表式报表阶梯背景色效果
- python常用小技巧_Python 实用技巧
- android dialog动画_Android超级酷炫实用的UI框架
- 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...