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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值