🔥字节高频面试算法:缓存算法LRU和LFU的简易实现
原文链接:
字节高频面试算法:缓存算法LRU和LFU的简易实现
本文主要介绍缓存算法LRU和LFU的简易实现
具体内容
缓存算法LRU和LFU是什么?
- LRU 和 LFU算法都是一种缓存淘汰策略
- LRU
- 每次新加入的值放在最前面
- 缓存移除时,需要删除最旧未使用的元素
- LFU
- 每次新加入的值进行频率统计
- 根据使用频率来决定淘汰那些缓存元素
- LRU
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)
- 如果元素不存在,则删除失败。
- 如果元素存在,则进行删除。
- boolean put(int key, String value)
-
LRU相关:既然是管理最近最少数据的,则必须考虑元素顺序,以及管理最近元素
- String getRecent()
- 获取最近的元素,并重新更新到队尾
- boolean makeRecently(Nodelj node)
- 更新最近元素
- boolean addRecently(int x, String value)
- 新增最近元素
- boolean deleteLeast()
- 删除最近不使用的元素
- String getRecent()
-
LFU相关:既然是管理最近最久数据的,则必须考虑元素频率
- void increaseFreq(int key)
- 提升频率
- void pageElimination()
- 替换操作,页面淘汰
- void increaseFreq(int key)
存储底层元素的数据结构设计
- 数据结构需求
- 需要一个结构来承接元素的先后顺序,且方便新增删除:链表
- 在进行删除第一个元素和插入最后一个元素时,能快速定位:带头节点和尾节点的链表
- 能方便在两端进行查找:带头节点和尾节点的双向链表
- 数据结构实现
- 双向链表
DuplexListljImpl - 双向链表节点
Nodelj
- 双向链表
- 该双向链表需要具备以下功能:
- boolean insertLast(Nodelj node)
- 将一个元素插入到链表尾部
- boolean delete(Nodelj node)
- 删除元素,并梳理节点关系
- Nodelj deleteOld()
- 删除并返回 链表首元素【当前链表中最早插入的元素】,即头节点指向的那个元素
- Nodelj getLeast()
- 返回 链表最后一个元素【最新插入的元素】,即尾节点指向的那个元素
- boolean insertLast(Nodelj node)
源码
原文地址:http://www.cnblogs.com/MicroMicroHard/p/16885014.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性