什么是LRU

LRU(Least recently
used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

我们维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。

  1. 如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。

  2. 如果此数据没有在缓存链表中,又可以分为两种情况:

如果此时缓存未满,则将此结点直接插入到链表的头部;
如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。

这样我们就用链表实现了一个 LRU 缓存,是不是很简单?

现在我们来看下缓存访问的时间复杂度是多少。因为不管缓存有没有满,我们都需要遍历一遍链表,所以这种基于链表的实现思路,缓存访问的时间复杂度为 O(n)。

实际上,我们可以继续优化这个实现思路,比如引入散列表(Hash table)来记录每个数据的位置,将缓存访问的时间复杂度降到 O(1)。因为要涉及我们还没有讲到的数据结构,所以这个优化方案,我现在就不详细说了,等讲到散列表的时候,我会再拿出来讲。

除了基于链表的实现思路,实际上还可以用数组来实现 LRU 缓存淘汰策略。如何利用数组实现 LRU 缓存淘汰策略呢?我把这个问题留给你思考

总结

  • 新数据插入到链表头部
  • 最近访问的数据移动到链表头部

如何基于链表实现 LRU 缓存淘汰算法?相关推荐

  1. 06 | 链表(上):如何实现LRU缓存淘汰算法?

    缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...

  2. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」

    作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...

  3. 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」

    作者 | 吴至波 责编 | 胡巍巍 快速挑战Python全栈工程师: https://edu.csdn.net/topic/python115?utm_source=csdn_bw 前几节学习了「链表 ...

  4. 看动画理解「链表」实现LRU缓存淘汰算法

    前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...

  5. 算法必知 --- LRU缓存淘汰算法

    作者:_code_x 链接:https://www.jianshu.com/p/b7fed77324b9 写在前 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾 ...

  6. 数据结构与算法 / LRU 缓存淘汰算法

    一.诞生原因 缓存是一种提供数据读取性能的技术,在硬件设计.软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等.但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即: ...

  7. LRU缓存淘汰算法优化

    上文中提到了LRU 缓存淘汰算法,可以帮助我们更好更合理的去使用缓存.但是它也有一个缺点就是如果有一些不满足"如果数据最近被访问过,那么将来被访问的几率也更高"的规律时,会破坏缓存 ...

  8. leetcode刷题:LRU缓存淘汰算法

    题目: 分析: 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用.那么, ...

  9. 广义表head tail 运算_双链表实现LRU缓存淘汰策略

    1.背景 LRU(Least Recently Used)是一种常用的缓存淘汰策略,即当缓存满了之后,删除最近最少使用的数据. LRU的实现,常用的编程语言在语言层面都有实现,可以直接使用.为了深入理 ...

最新文章

  1. 图书借阅系统java_基于JAVAWEB的图书借阅系统
  2. NYOJ 496 巡回赛 拓扑排序
  3. BZOJ 2282 树的直径
  4. 神秘大三角(判断点与三角形的关系)
  5. python3.7 ‘utf-8‘ codec can‘t decode byte 0xbe in position 0: invalid start byte
  6. AT1981-[AGC001C]Shorten Diameter
  7. docker之基础命令相关操作上
  8. JavaSE基础——数组概述和定义格式说明
  9. AJAX 数据库实例
  10. 关闭VS2019和VAssistX的导航栏
  11. JDK1.6官方下载_JDK6官方下载
  12. 三维地震数据segy数据显示
  13. wmic冻结进程_WMIC的用法
  14. 在心中刻上你的名字,让思念如烟
  15. 【初识数据结构】手把手教会你时间复杂度的计算方法
  16. 2023年,我觉得拼夕夕值得去
  17. 以太坊区块同步成功标志
  18. WIN10 连接 BOSE QC35 蓝牙耳机时断时续问题
  19. 【滴水逆向笔记】C语言结构体
  20. Vue+SpringBoot+ElementUI实战学生管理系统-10.学生管理模块

热门文章

  1. mysql 将select结果导出文件 linux
  2. 基础02Random类、ArrayList类
  3. Python求梅森尼数
  4. ngnix学习(二)ngnix常用命令
  5. cesium 加载科技感
  6. mysql jpa默认值_Spring JPA-枚举中枚举字段的默认值
  7. qtreewidgetitem 选中背景颜色_列表式报表阶梯背景色效果
  8. python常用小技巧_Python 实用技巧
  9. android dialog动画_Android超级酷炫实用的UI框架
  10. 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...