🔥字节高频面试算法:缓存算法LRU和LFU的简易实现

原文链接:
字节高频面试算法:缓存算法LRU和LFU的简易实现

本文主要介绍缓存算法LRU和LFU的简易实现

🔥关注我的代码仓,实时更新笔试题
联系方式

具体内容

缓存算法LRU和LFU是什么?

  • LRU 和 LFU算法都是一种缓存淘汰策略
    • LRU
      • 每次新加入的值放在最前面
      • 缓存移除时,需要删除最旧未使用的元素
    • LFU
      • 每次新加入的值进行频率统计
      • 根据使用频率来决定淘汰那些缓存元素

LRU和LFU的底层数据结构

  • LRU
    • 主要使用双向链表和一个Map来实现。
    • Map是为了方便随时取用
    • 双向链表是为了梳理元素出现的先后顺序
    • Map的<key,value>中,value是双向链表的Node节点
  • LFU
    • 主要使用三个Map和一个最小频次记录数minFreq来实现
    • 三个Map
      • key 到 val 的映射,KV 表
      • key 到 freq 的映射,KF 表
      • freq 到 key 列表的映射,FK 表
    • 最小频次记录数 minFreq 主要用于定位最小频率的key,便于及时缓存释放

接口梳理

  • 通用接口:既然是缓存,管理数据,那么必然有put()和get()以及delete()接口。

    • boolean put(int key, String value)
      • 需要考虑元素是否存在,缓存是否满的问题
      • 如果元素已经存在,则需要更新到最新的位置即可
      • 如果元素不存在,则需要需要插入数据到最新的位置
      • 如果缓存已满,则需要清除最老的一个元素,再进行插入更新
    • String get(int key)
      • 如果元素不存在,则返回空,
      • 存在的话,返回对于元素,并且更新元素只最新位置。
    • boolean delete(int x)
      • 如果元素不存在,则删除失败。
      • 如果元素存在,则进行删除。
  • LRU相关:既然是管理最近最少数据的,则必须考虑元素顺序,以及管理最近元素

    • String getRecent()
      • 获取最近的元素,并重新更新到队尾
    • boolean makeRecently(Nodelj node)
      • 更新最近元素
    • boolean addRecently(int x, String value)
      • 新增最近元素
    • boolean deleteLeast()
      • 删除最近不使用的元素
  • LFU相关:既然是管理最近最久数据的,则必须考虑元素频率

    • void increaseFreq(int key)
      • 提升频率
    • void pageElimination()
      • 替换操作,页面淘汰

存储底层元素的数据结构设计

  • 数据结构需求
    • 需要一个结构来承接元素的先后顺序,且方便新增删除:链表
    • 在进行删除第一个元素和插入最后一个元素时,能快速定位:带头节点和尾节点的链表
    • 能方便在两端进行查找:带头节点和尾节点的双向链表
  • 数据结构实现
  • 该双向链表需要具备以下功能:
    • boolean insertLast(Nodelj node)
      • 将一个元素插入到链表尾部
    • boolean delete(Nodelj node)
      • 删除元素,并梳理节点关系
    • Nodelj deleteOld()
      • 删除并返回 链表首元素【当前链表中最早插入的元素】,即头节点指向的那个元素
    • Nodelj getLeast()
      • 返回 链表最后一个元素【最新插入的元素】,即尾节点指向的那个元素

源码

原文地址:http://www.cnblogs.com/MicroMicroHard/p/16885014.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性