如何使用最简单和最小的数据结构实现LFU缓存。

时间:2016-06-11 03:11:37

标签: java data-structures linkedhashmap lru linkedhashset

我在接受采访时被问到这个问题,他首先询问了LRU和LFU之间的区别,然后要求实施两者。我知道LRU可以通过LinkedHashMap实现,但我对LFU感到困惑。任何人都可以告诉我如何用最简单的数据结构和良好的解释来实现它? 它也可以用LinkedHashMap实现。

1 个答案:

答案 0 :(得分:1)

假设缓存条目已键入,您可以使用队列(LinkedList)和映射(HashMap)来执行此操作。

(假设队列和地图已满)
为队列选择绑定b。在每个缓存请求中,将请求页面的密钥推入队列,然后轮询队列 如果您想要的页面在地图中,请返回页面。如果页面中没有页面,则查找队列中最不常出现的键,该键也位于所需页面的地图或键中。如果该键是您想要的页面的键,则不执行任何操作;否则从该地图中删除该键的条目,并将您的页面插入地图 退回你的页面。

缓存命中的复杂度为O(1),O(b)为未命中 这假设您想要限制频率。即。 "在最后的b请求中最少使用"而不是最常使用的"。