如果我们要使用LRU
和HashMap
实现DoublyLinkedList
缓存,那么以evict()
的时间复杂度实现O(1)
方法的最佳方法是什么? / p>
答案 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
是最基本的结构(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
是最新的项目。它可以用来暗示某种缓存,尽管我不确定它是否完全符合您的要求。