字节二面:让写一个LFU缓存策略算法,懵了

一:LRU是什么

LFU,全称是:Least Frequently Used,最不经常使用策略,在一段时间内,数据被使用频次最少的,优先被淘汰。最少使用(LFU)是一种用于管理计算机内存的缓存算法。主要是记录和追踪内存块的使用次数,当缓存已满并且需要更多空间时,系统将以最低内存块使用频率清除内存.采用LFU算法的最简单方法是为每个加载到缓存的块分配一个计数器。每次引用该块时,计数器将增加一。当缓存达到容量并有一个新的内存块等待插入时,系统将搜索计数器最低的块并将其从缓存中删除(本段摘自维基百科)

解释:上面这个图就是一个LRU的简单实现思路,在链表的开始插入元素,然后每插入一次计数一次,接着按照次数重新排序链表,如果次数相同的话,按照插入时间排序,然后从链表尾部选择淘汰的数据~

二:LRU实现

2.1 定义Node节点

Node主要包含了key和value,因为LFU的主要实现思想是比较访问的次数,如果在次数相同的情况下需要比较节点的时间,越早放入的越快 被淘汰,因此我们需要在Node节点上加入time和count的属性,分别用来记录节点的访问的时间和访问次数。

其他的版本实现方式里有新加个内部类来记录 key的count和time,但是我觉得不够方便,还得单独维护一个map,成本有点大。还有一点注意的是这里实现了comparable接口,覆写了compare方法,这里 的主要作用就是在排序的时候需要用到,在compare方法里面我们

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个 Python 实现的 LFU 缓存: ```python from collections import defaultdict class LFUCache: def __init__(self, capacity): self.capacity = capacity self.cache = {} self.freq = defaultdict(OrderedDict) self.min_freq = 0 def get(self, key): if key not in self.cache: return -1 value, freq = self.cache[key] self.freq[freq].pop(key) if len(self.freq[freq]) == 0: self.freq.pop(freq) if self.min_freq == freq: self.min_freq += 1 self.freq[freq+1][key] = value self.cache[key] = (value, freq+1) return value def put(self, key, value): if self.capacity == 0: return if key in self.cache: self.cache[key] = (value, self.cache[key][1]) self.get(key) return if len(self.cache) == self.capacity: k, v = self.freq[self.min_freq].popitem(last=False) self.cache.pop(k) self.cache[key] = (value, 1) self.freq[1][key] = value self.min_freq = 1 ``` 该实现中,LFU 缓存使用了一个字典 `cache` 来存储 key-value 对,使用一个字典 `freq` 来记录每个频次对应的 key-value 对,使用变量 `min_freq` 来记录当前最小的频次。 在 `get` 方法中,如果 key 不存在于 `cache` 中,则返回 -1。否则,将 key 对应的 value 和频次从 `freq` 中删除,如果该频次对应的 key-value 对已经为空,则将该频次从 `freq` 中删除,并更新 `min_freq`。然后,将 key 对应的 value 和频次加一后添加到 `freq` 中,并更新 `cache` 中的 key-value 对。 在 `put` 方法中,如果 `capacity` 为 0,则直接返回。如果 key 已存在于 `cache` 中,则将 `cache` 中的 key-value 对更新,并调用 `get` 方法以更新 `freq` 和 `min_freq`。如果 `cache` 已经满了,则从 `freq` 中删除当前最小频次的 key-value 对,并从 `cache` 中删除对应的 key-value 对。然后,将新的 key-value 对添加到 `cache` 和 `freq` 中,并将 `min_freq` 设置为 1。 使用示例: ```python cache = LFUCache(2) cache.put(1, 1) cache.put(2, 2) assert cache.get(1) == 1 cache.put(3, 3) assert cache.get(2) == -1 assert cache.get(3) == 3 cache.put(4, 4) assert cache.get(1) == -1 assert cache.get(3) == 3 assert cache.get(4) == 4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值