【发布时间】:2019-03-03 17:11:31
【问题描述】:
如果我们使用HashMap 和DoublyLinkedList 实现LRU 缓存,那么以O(1) 时间复杂度实现evict() 方法的最佳方法是什么?
【问题讨论】:
-
java.util.LinkedHashMap有一些特性来实现 LRU,我更新了答案,也许你会考虑是否使用它。
标签: java algorithm caching lru evict
如果我们使用HashMap 和DoublyLinkedList 实现LRU 缓存,那么以O(1) 时间复杂度实现evict() 方法的最佳方法是什么?
【问题讨论】:
java.util.LinkedHashMap 有一些特性来实现 LRU,我更新了答案,也许你会考虑是否使用它。
标签: java algorithm caching lru evict
来自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 是最新的项目。它可以用来实现某种缓存,但我不确定它是否完全符合您的要求。
【讨论】: