看一看LRU与LFU

news2024/11/18 11:22:07

        LRU(Least recently used:最近最少使用)和LFU(Least frequently used:最不经常使用),两个都是以链表结构为基础,一般是作为缓存使用,当然,既然是缓存,空间肯定是有限制的,不然你直接把内存挤爆了,那程序也只能GG了。

        在空间大小一定的情况下,LRU是淘汰最久没有使用的数据,LUF是淘汰使用次数最少的数据。

        我们先来看下LRU,目的淘汰最长时间没有使用的数据对象,那么,必然是要有个排列顺序,不然如何知道那个数据最长时间没有使用?

        好了,现在我们有一串数据需要按照某种顺序存储,当然,这个数据肯定是会频繁变更的,你问为啥?

         缓存是干啥的?就是方便读取数据,可这个数据每次读取的肯定不会都一样啊,最终空间是肯定不够的,最终不还是要删除+修改?这也是LRU的意义所在,不然全部缓存了,还要LRU干啥子!

        我们再来看看,LRU最终的期望是什么样的,不是有结果导向论么?咱就根据目标来设计结构呗!下面是一个简单的LRU的读取过程。

        如上图,数据原本是A>B>C>D>E>F>G>H,如今读取到了D,那么就把D移动到最前面,变成了D>A>B>C>E>F>G>H。

        如果再加上一个数据呢?比如M,那M自然也就排队在头部,尾部的数据淘汰,新的缓存就变成了M>A>B>C>E>F>G。

        H由于处在最尾部,超过了空间的限制,因而被删除掉了。

        这也就是我们所期望的简单的LRU实现的功能,那么根据这种情况,使用哪种结构合适呢?从上面的过程可以看到,这个list有增删,而且新增或者移动几乎都是头插法。

        ArrayList直接干掉!不然移动数组元素就能把人累个半死!

        接着就是链表结构了,单链表还是双链表?肯定是双链表啊,中间的数据不是有移动?没有后退指针,如何查询这个数据前面的一个?从头开始再找一遍?

        大致结构固定了,来看下这个双链表的增删改查。

        增:头插法,判断链表长度,插入到头结点,过载的话删除最后一个节点

        改:长度不变,删除中间的某个节点,插入到头部,两步完成。

        查:从头结点开始,查询对应数据,时间复杂度O(n)。

        LRU结构追求的就是速度,利用内存来置换时间,减轻数据库端负载,而且查询的次数非常多,无论是查询还是改动的时候定位数据,都会用到。O(n)的时间复杂度能否优化?

        我们常见的时间复杂度比O(n)还优秀的,应该就是O(logN)和O(1)了,结构有哪些呢?首先是树结构或者是跳跃表结构,查询的时间复杂度是O(logN)。不过在修改和删除的时候,涉及到树的变换和跳跃表结构的变化。可选,加上这个结构的话,如果查询次数远大于增改次数的话,时间方面应该有不小的优势。可备选。

        然后就是数组,根据位置,定位对象,时间复杂的O(1),当然这个不太符合我们的要求,每次插入头部这个,就直接拖后腿了;如果根据对象信息挨个查询,时间复杂度也是O(1),那完全没必要了,这个在选择结构的时候就淘汰了,再加一个不是自找麻烦浪费时间吗?

        然后就是hash,时间复杂度O(1),根据key,定位value!这个就比较符合我们的期望了了,唯一绑定,复杂度只是O(1),增删也比较方便,而且排序我们已经在双链表中做了,定位这里也就不用再关心了。

        因此,LRU的结构我们便能简单的确定了,双链表+Hash,hash定位数据,双链条淘汰数据,以空间换取时间,在查询量比较大的组件中实用比较多。当然,除了双链表+hash的LRU,结构还可以进一步优化,有兴趣的可以看下Mysql的buffer pool里面的LRU list,其中一些优化就十分优秀。

        代码实现什么的就不在这里赘述了,有兴趣的可以自己写一个,刚入门数据结构的话,也阔以去B站找个视频看下,最多一二十分钟,直接给你把代码写的明明白白。

        说完LRU,接着就是LFU了,当然,这个也是多个结构共同组成的,hash定位肯定必不可少,这个是辅助定位数据,关系到数据的查询效率!

        然后就是淘汰策略了,Least frequently used:最不经常使用,也就是说使用次数最少的,率先淘汰掉!

        so,必须要有个记录使用次数的。

        使用次数有 1,2,3,4...等等等,然后每个使用次数后面对应着一批数据,可能是单个,也可能多个,当然我们肯定统一认为有多个,也就是一个list!

         这不就是个Map结构吗?次数是可key,数据list是value!

        数据每查询一次,就将这个次数里面list的对应数据移出来,添加到当前次数+1 的Map中的value里面去!

        就是加了一层,多了一个套路。

        至于map中的list,直接使用双链表就好,毕竟定位的时候使用hash,新增删除双链表的速率肯定是高于数组的。

        这样,LFU的结构就可以得出来了。

        hash + Map  (n->双链表)!

        结构大致就是这样,图形什么的就不画了,绝不是因为懒,绝不是!        

   觉得get到一点点东东的话,帮忙点个赞呗!

  来碗鸡汤: 勤学如春起之苗,不见其增日有所长;辍学如磨刀之石,不见其损日有所亏!

  与君共勉!

no sacrifice ,no victory!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第六章:L2JMobius学习 – 源码讲解网络数据通信

本章节介绍客户端和服务器端的网络数据通信,使用的技术是Java NIO(也就是套接字Socket)。服务器端和客户端使用Socket通信的原因在于,它是双向的,持久的。也就是说,服务器端可以随时的向客户端发送数据&…

Tomcat7部署war包getshell 漏洞复现

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 验证方式03 利用方式04 修复方案 01 漏洞描述 Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相…

pycharm如何给一串中文快捷加引号(方法一)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 门前冷落鞍马稀,老大嫁作商人妇。 大家好,我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个Pycharm基础的问题&a…

Linux文件管理常用命令补充

(该图由AI绘制 关注我 学习AI画图) 目录 一、查看文件内容 more分屏显示文件内容(了解) less分屏显示文件内容(重点) 二、文件统计命令 1、wc命令 2、du命令 三、文件处理命令 1、find命令 2、gr…

unity相机视角平移一段距离

using System.Collections; using System.Collections.Generic; using UnityEngine;public class ControlCamera : MonoBehaviour {//相机视角焦点平移一段距离//需求 相机视角 内的3D对象A 在视角内平移到屏幕C点 public Vector3 InitCameraPos;// Start is called be…

代码随想录算法训练营第十一天 | 二叉树系列2

二叉树系列2 101 对称二叉树二叉树很重要的一点:确定遍历顺序关于递归代码随想录的代码我的代码(理解后编写) 100 相同的树我的代码 572 另一个树的子树我的代码录友的代码,只用递归!!! 104 二叉树的最大深度重点代码随…

OA办公自动化系统哪个好?办公系统oa排名及对比

一、什么是OA办公自动化系统 OA(Office Automation办公自动化)是一种将智能化科技应用于企业管理中的应用系统。它可以通过电脑网络、互联网等技术手段,将企业的各种业务流程、各种业务数据进行集成和处理,将各种业务流程和各种业…

winfrom 利用反射 加载窗体(单例)

①新建一个项目, 程序集名称为: AssemblyForm (下面要用到的) ②新建一个Form窗体,窗体名称为: Form1 (下面也要用到), Form1里的代码: using System; using System.Windows.Forms;namespace AssemblyForm {public partial class Form1 : Form{public Form1(){InitializeCo…

web-html的基本用法

web前端代码基本用法 <html> <head><meta charset"utf-8"><!-- charset 属性规定 HTML 文档的字符编码。要是没有规定字符编码的话是有可能乱码的 -->待到秋来九月八&#xff08;head&#xff09;<!-- 头部就是直接写在最上面的文字&…

Css:高级技巧

1.精灵图使用 用ps的切片功能测量图片大小和位置 2.字体图标 3.CSS三角形 4.元素显示隐藏 5.鼠标样式 6.输入框input 轮廓线 7.防止文本域拖拽 8 vertical-align实现行内块和文字垂直居中对齐 9.单行文字溢出省略号显示 10.多行文字溢出省略号显示 11.布局技巧 1.相对定位会压…

实战|如何在Linux 系统上免费托管网站

动动发财的小手&#xff0c;点个赞吧&#xff01; Web 服务器可用于指代硬件和软件&#xff0c;或者两者一起工作。出于本指南的目的&#xff0c;我们将重点关注软件方面&#xff0c;并了解如何在 Linux 机器上托管网站。 Web 服务器是一种通过 HTTP/HTTPS 协议接收并响应客户端…

【算法集训之线性表篇】Day 03

文章目录 题目一思路分析代码实现效果 题目一 从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素&#xff0c;若s或t不合理或者线性表为空&#xff0c;则显示错误信息并退出运行。 思路分析 首先&#xff0c;题目给出数据结构为有序顺序表&#xff0c;故要查找…

B站创建视频分集播放列表

上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1、打开B站 2、登录B站后&#xff0c;点击投稿上传视频。 3、上传视频或把视频直接拖拽到页面里&#xff1b; 4、点击上传第一个视频后页面下会出现一个号的按钮&#xff0c;点击继续上传 &#xff0c;上传视频就…

【Python】Selenium操作cookie实现免登录

文章目录 一、查看浏览器cookie二、获取cookie基本操作三、获取cookie并实现免登录四、封装成函数 一、查看浏览器cookie cookie、session、token的区别&#xff1a; cookie存储在浏览器本地客户端&#xff0c;发送的请求携带cookie时可以实现登录操作。session存放在服务器。…

MybatisPlus逆向生成实体类等

面试中遇到的一道机操题&#xff0c;so simple。 这是里SpringBoot项目&#xff0c;注意你的数据表中只有一个id字段是会生成失败的&#xff01; 添加maven依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter…

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记

UPCGBlueprintElement是PCGGraph中自定义节点的基类&#xff0c;但官方目前还没有给出详细的文档&#xff0c;所以从源代码里找点答案。 文章目录 可覆盖函数&#xff08;Override Functions&#xff09;Excute 和 Excute with ContextLoop Body函数和Loop函数Point Loop Body和…

SpringBoot+ Vue 家乡美食系统

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

[期末网页作业]-精仿华为官网10个网页(html+css+js)

经过漫长的期末考试季节&#xff0c;我成功地完成了一个华为官网的仿写项目&#xff0c;并且非常高兴地与大家分享。这个项目包含了10个页面&#xff0c;每一个页面都经过了精心的设计和努力的填充。 首先&#xff0c;我注重了页面的整体布局与设计。借鉴了华为官网的风格&…

Unity3d-UGUI实现的贪食蛇小游戏

按鼠标WASD键来控制蛇的走向。 核心的代码如下&#xff1a; using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI;/// 《UGUI贪吃蛇》public class TCS2d : MonoBehaviour {public bool isOver false;public bool isStop…

【Docker 部署Minio】

Docker 部署Minio 一、拉取Minio镜像二、配置1、创建如下目录2、创建容器并运行 三、访问 一、拉取Minio镜像 访问Docker Hub镜像站找到自己需要的Minio镜像 运行以下命令 sudo docker pull minio/minio二、配置 1、创建如下目录 mkdir -p /home/zx/minio/config mkdir -p…