【问题标题】:Why LRU caches use doubly link list and not singly link list?为什么 LRU 缓存使用双链表而不是单链表?
【发布时间】:2020-06-01 05:38:59
【问题描述】:
我一直在试图理解为什么 LRU 缓存使用双链表而不是单链表?
如果我按时间复杂度计算,它们在插入、更新和删除方面都相同。
Here is the Cheat sheet
是不是因为 DLL 中的两种方式的指针用于更容易地将节点移动到后面或前面??
【问题讨论】:
标签:
algorithm
data-structures
linked-list
hashmap
lru
【解决方案1】:
使用列表(DLL/SLL)实现 LRU 缓存的想法是将最近使用的页面(节点)移到前面。
这涉及到很多移位,比如说节点在列表的中间(DLL/SLL),你必须删除节点,重新排列前一个节点的下一个指针。
现在在这种情况下,如果我们使用单链表,我们必须维护最近访问节点的前一个节点。
如果我们使用双向链表,则不需要此操作,因为它已经维护了上一个和下一个指针。
这里的问题是访问最新的节点,为此我们使用哈希表让我们在 O(1) 中访问该节点。
【解决方案2】:
要从链表中删除目标节点,您需要修改指向它的其他节点。
在双向链表中,目标节点具有指向这些其他节点的指针,因此很容易找到它们。
在单链表中,目标节点没有有指向另一个节点的指针。不过,您仍然需要修改该节点,因此您必须搜索它。