java - 如何使用最简单、最少的数据结构来实现 LFU 缓存?

标签 java data-structures linkedhashmap lru linkedhashset

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

最佳答案

假设缓存条目已键入,您可以使用队列 (LinkedList) 和映射 (HashMap) 来实现。

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

缓存命中的复杂度为 O(1),未命中的复杂度为 O(b)。
这假设您想要限制频率。 IE。 “最近 b 请求中最不常用”而不是“有史以来最不常用”。

关于java - 如何使用最简单、最少的数据结构来实现 LFU 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37759551/

相关文章:

java - 获取 LinkedHashMap 的前一个元素

algorithm - 在旅游中容纳最多的人

c - 我需要帮助在 C 中从中缀转换为后缀

c - 使用 AVL 树进行哈希处理

java - 反序列化为使用 Gson 扩展 LinkedHashMap 的类

java - @Lazy注解和<bean/>标签的lazy-init属性有什么区别?

java - 启动脚本中的 GATE -Dgate.plugins.home 选项

java - 为什么在java中我们不能通过一个扫描器对象获取用户输入的int和string?

java - 如何用 Jackson 解析嵌套数组?

java - 在 Java 8 中迭代 HashMap 时出现稳定的元素排序问题