如果我们使用and来实现LRU
缓存,那么实现具有时间复杂度的方法的最佳方法是什么?HashMap
DoublyLinkedList
evict()
O(1)
user3133925
问问题
517 次
1 回答
0
LinkedList
fromJava
没有暴露Node
类型(这是一个private static
内部类)。
所以你不能在 in 中删除它O(1)
,因为需要顺序扫描。
要获取O(1)
,您需要能够访问该Node
类型,以便无需扫描即可将其删除。
你必须自己写。幸运的是,adoubly linked list
相对容易编写,而且是一项非常有益且有趣的任务。
如何删除给定的Node
?
参考这个答案:https ://stackoverflow.com/a/54593530
该方法LinkedList.java
->removeNode()
删除给定节点,无需顺序扫描。
此答案中的代码适用于单链表,remove
在某些情况下,双链表甚至更简单。
提示:
- 如果给定节点是链表中的结束节点,那么您也需要前一个节点。
但这是 forsingly linked list
,对于 adoubly linked node
,节点本身包含前一个节点,因此您不必将前一个节点传递给该removeNode()
方法。
顺便提一句
- 为什么是有益的?
linked list
是最基本的结构(除了array
andbits
),其他一些非常基本的结构可以基于它构建。
例如,两者都queue
可以stack
使用linked list
. - 并发访问
java.util.LinkedList
不是线程安全的,您的 LRU 可能需要一些并发控制,但我不确定。
如果需要,那么java.util.concurrent.ConcurrentLinkedDeque
是一个很好的例子可以参考。
@更新 LinkedHashMap
java.util.LinkedHashMap
, 是哈希表和双向链表的组合。
机制:
- 它扩展
HashMap
以获得O(1)
常见操作的复杂性。 - 并用于
doubly linked list
跟踪插入顺序。
head
是最旧的项目,并且tail
是最新的项目。
它可用于实现某种缓存,但我不确定它是否完全符合您的要求。
于 2019-03-03T19:25:00.047 回答