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

How can you implement LFU cache using simplest and minimum data structures.?

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

假设缓存条目是键控的,您可以使用队列 (LinkedList) 和映射 (HashMap) 来完成。

(假设队列和地图已满)
为队列选择一个边界 b。在每次缓存请求时,将所请求页面的键推送到队列中,然后轮询队列。
如果您想要的页面在地图中,return 页面。如果该页面不在地图中,请在队列中找到最不频繁出现的键,该键也在您想要的页面的地图或键中。如果那个键是你想要的页面的键,什么也不做;否则从映射中删除该键的条目并将您的页面插入映射。
Return 你的页面。

缓存命中的复杂度为 O(1),未命中的复杂度为 O(b)。
这假设您想要限制频率。 IE。 "least frequently used in the last b requests" 而不是 "least frequently used ever".