【问题标题】:LRU Cache Evict method implementationLRU Cache Evict 方法实现
【发布时间】:2019-03-03 17:11:31
【问题描述】:

如果我们使用HashMap 和DoublyLinkedList 实现LRU 缓存,那么以O(1) 时间复杂度实现evict() 方法的最佳方法是什么?

【问题讨论】:

  • java.util.LinkedHashMap 有一些特性来实现 LRU,我更新了答案,也许你会考虑是否使用它。

标签: java algorithm caching lru evict


【解决方案1】:

来自Java 的LinkedList 没有暴露Node 类型(这是一个private static 内部类)。

所以你不能在O(1) 中删除它,因为需要顺序扫描。

要获取O(1),您需要能够访问Node 类型,以便无需扫描即可将其删除。

你必须自己写。幸运的是,doubly linked list 相对容易编写,而且是一项非常有益且有趣的任务。


如何使用给定的Node 删除?

参考这个答案:https://stackoverflow.com/a/54593530

LinkedList.java 方法 -> removeNode() 删除给定节点,无需顺序扫描。

此答案中的代码适用于单链表,在某些情况下,双链表的 remove 甚至更简单。

提示:

  • 如果给定节点是链表中的结束节点,那么您也需要前一个节点。
    但是对于singly linked list,对于doubly linked node,节点本身包含前一个节点,因此您不必将前一个节点传递给removeNode() 方法。

顺便说一句

  • 为什么它是有益的?
    linked list 是最基本的结构(除了array 和bits),其他一些非常基本的结构可以基于它构建。
    例如,queue 和 stack 都可以通过 linked list 轻松实现。
  • 并发访问
    java.util.LinkedList 不是线程安全的,您的 LRU 可能需要一些并发控制,但我不确定。
    如果需要,java.util.concurrent.ConcurrentLinkedDeque 是一个很好的参考示例。

@更新LinkedHashMap

java.util.LinkedHashMap,是哈希表和双向链表的组合。

机制:

  • 它扩展了HashMap 以获得常见操作的O(1) 复杂性。
  • 并使用doubly linked list 跟踪广告订单。
    head 是最旧的项目,tail 是最新的项目。

它可以用来实现某种缓存,但我不确定它是否完全符合您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多