LRU Cache Evict方法实现

时间:2019-03-03 17:11:32

标签: java algorithm caching lru evict

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

1 个答案:

答案 0 :(得分:1)

来自LinkedList

Java没有公开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是最基本的结构arraybits除外),其他一些非常基本的结构也可以以此为基础。
    例如,queuestack都可以通过linked list轻松实现。
  • 并发访问
    java.util.LinkedList不是线程安全的,您的LRU可能需要一些并发控制,但是我不确定。
    如果需要,java.util.concurrent.ConcurrentLinkedDeque是一个很好的例子。

@Update LinkedHashMap

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

机制:

  • 它扩展了HashMap,从而使常见操作的复杂度达到了O(1)
  • 并使用doubly linked list跟踪插入顺序。
    head是最旧的项目,tail是最新的项目。

它可以用来暗示某种缓存,尽管我不确定它是否完全符合您的要求。