当前位置: 首页 > news >正文

LFU算法实现笔记

LFU算法概述
  • 名称: Least Frequently Used(最不经常使用)
  • 用途: 缓存淘汰策略
  • 核心思想: 根据缓存访问次数进行排序,优先淘汰访问次数最少的缓存项
LFU列表操作
  1. 写入缓存

    • 新增缓存: 当缓存不存在时,添加到访问次数为1的链表头部,超过容量时删除尾部节点。
    • 更新缓存: 当缓存已存在时,更新值并增加访问次数,移动至相应访问次数链表的头部。
  2. 读取缓存

    • 缓存不存在: 返回null或其他默认值。
    • 缓存存在: 返回缓存值,增加访问次数,并移动至相应访问次数链表的头部。
LFU算法设计思路
  • 数据结构选择: 使用链表,因为频繁进行节点的新增和删除。
  • 快速定位: 使用哈希表,key为访问次数,value为缓存节点链表。
  • 虚拟头节点: 通过head.next快速定位访问次数链表的头节点。
  • 最小访问次数链表: 使用minFreq变量记录,并用双向链表和虚拟尾节点快速定位尾节点。
代码实现
  • 核心思想: 双哈希表
  • 类定义: LFUCache
    • 成员变量:
      • size: 当前缓存大小
      • cap: 最大容量
      • minFreq: 最小访问次数
      • keyMap: 缓存key到节点的映射
      • freqMap: 访问次数到链表的映射
    • 方法:
      • get(int key): 根据key获取缓存值
      • put(int key, int value): 添加或更新缓存项
get方法流程
  1. 检查key是否存在于keyMap
  2. 如果存在,获取节点,更新访问次数,移动至相应访问次数链表头部。
  3. 如果不存在,返回-1。
put方法流程
  1. 检查key是否存在于keyMap
  2. 如果不存在,且缓存已满,则删除minFreq链表尾部节点。
  3. 添加或更新节点,更新访问次数,移动至相应访问次数链表头部。
辅助类定义
  • MLinkedNode: 链表节点,包含key、value、访问次数及前后指针。
  • MLinkedList: 双向链表,包含虚拟头尾节点,提供添加和删除节点的方法。
使用示例
  • 实例化LFUCache对象。
  • 使用get(key)put(key, value)方法进行操作。

总结

LFU算法通过维护一个按访问次数排序的缓存列表,实现了高效的缓存淘汰机制。通过双哈希表和双向链表的设计,算法能够快速地进行缓存的读写操作,同时保持较低的时间复杂度。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【postgresql】pg_dump备份数据库
  • 六爻排盘 api数据接口
  • mmc-utils 的 MMC 测试工具
  • nng协议nni_posix_resolv_sysinit()系统初始化
  • iOS ------ ARC的工作原理
  • Android获取当前屏幕显示的是哪个activity
  • 访问控制系列
  • 【RPC注册发现框架实战】一个简易的RPC注册发现框架
  • Vue.js:如何区分页面关闭和刷新?深入解析与实战
  • mysql命令练习
  • 测试开发面经总结(三)
  • Qt篇——QSqlQueryModel内容居中显示
  • Stable Diffusion:质量高画风清新细节丰富的二次元大模型二次元插图
  • 服务器的80和443端口关闭也能申请SSL证书
  • 容器安全最佳实践和工具
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译]CSS 居中(Center)方法大合集
  • HashMap ConcurrentHashMap
  • iOS | NSProxy
  • Java深入 - 深入理解Java集合
  • 大主子表关联的性能优化方法
  • 动态规划入门(以爬楼梯为例)
  • 简单数学运算程序(不定期更新)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 思否第一天
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • puppet连载22:define用法
  • 如何用纯 CSS 创作一个货车 loader
  • ​如何防止网络攻击?
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (30)数组元素和与数字和的绝对差
  • (4.10~4.16)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (自用)交互协议设计——protobuf序列化
  • .gitignore文件使用
  • .Net 6.0--通用帮助类--FileHelper
  • .net core docker部署教程和细节问题
  • .NET 反射的使用
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET基础篇——反射的奥妙
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @Transactional 参数详解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [000-01-011].第2节:持久层方案的对比
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [AAuto]给百宝箱增加娱乐功能
  • [AIGC] MySQL存储引擎详解
  • [Android]常见的数据传递方式
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)