当前位置: 首页 > 知识库问答 >
问题:

具有单链表的LRU缓存

宿嘉
2023-03-14

大多数LRU缓存教程强调组合使用双向链表和字典。字典保存该值和对链表上相应节点的引用。

当我们执行删除操作时,我们从字典中的链表中查找节点,我们必须将其删除。

现在这里是它变得奇怪的地方。大多数教程认为,我们需要前面的节点才能从链表中删除当前节点。这样做是为了获得O(1)时间。

但是,这里有一种方法可以在O(1)时间内从单链接列表中删除节点。我们将当前节点的值设置为下一个节点,然后杀死下一个节点。

我的问题是:为什么所有这些教程都展示了如何用双向链表实现LRU缓存,而我们可以通过使用单链表来节省恒定空间?

共有2个答案

南宫森
2023-03-14

交换有效载荷会有一些麻烦

  • 有效负载可能很大(如缓冲区)
  • 部分应用程序代码可能仍然引用有效负载(将其固定)
  • 可能涉及锁或互斥锁(可由DLL/哈希节点和/或有效负载拥有)

在任何情况下,修改DLL最多影响2*2个指针,交换有效负载将需要(交换的memcpy)走哈希链(两次),这可能需要访问结构中的任何节点。

唐增
2023-03-14

您是正确的,可以使用单链表而不是双链表,如下所示:

标准的方法是将hashmap指向一个双链接列表,以简化删除。要在不使用O(n)搜索的情况下使用单链接列表,请让hashmap指向链接列表中的前一个节点(您关心的节点的前一个节点,如果元素位于前面,则为null)。

Retrieve list node:
hashmap(key) ? hashmap(key)->next : list.head

Delete:
successornode = hashmap(key)->next->next
hashmap( successornode ) = hashmap(key)
hashmap(key)->next = successornode
hashmap.delete(key)

为什么双链接列表在LRU解决方案中如此常见?它更容易理解和使用。

如果优化是一个问题,那么用一个稍微不那么简单的单链表解决方案进行权衡绝对是值得的。

 类似资料:
  • 问题内容: 我正在为我的PHP驱动的网站寻找内存缓存。它不是高流量的网站,我只想缓存数据和某些页面的某些部分以提高性能。数据大小从几字节到几kB不等。我目前正在使用xCache,并且没有问题。 切换到内存缓存或Redis更好吗?有没有更好的选择? 问题答案: 如果您没有任何明显的问题,为什么要立即切换?内存缓存或Redis可能更好,但是如果您现在不需要它们,最好保留它们。只要您的缓存策略是正确的,

  • 我一直试图理解为什么LRU缓存使用双重链接列表而不是单一链接列表? 如果按时间复杂度计算,它们的插入、更新和删除都是相同的。这是备忘单 是因为DLL中的双向指针用于更容易地将节点移动到后部还是前部??

  • 问题内容: 我知道实现起来很简单,但是我想重用已经存在的东西。 我要解决的问题是,我为不同的页面,角色加载了配置(从XML,所以我想缓存它们),因此输入的组合可以增长很多(但99%的增长)。为了处理这一1%,我想在缓存中设置一些最大项目… 直到我在apache commons中找到了org.apache.commons.collections.map.LRUMap,它看起来还不错,但还想检查一下其

  • 问题内容: 这是工作面试中经常提到的一个问题。这个想法是定义一个数据结构,而不是使用Java在LinkedHashMap中内置的结构。 LRU缓存会删除 最近最少使用的 条目,以插入新的条目。因此,鉴于以下情况: 其中A是最近最少使用的项目,如果要插入F,则需要删除A。 如果我们保留一个HashMap,其中包含按(键,值)的缓存条目以及包含元素的键和使用时间的单独列表,则可以轻松实现这一点。但是,

  • 本文向大家介绍什么是LRU缓存?相关面试题,主要包含被问及什么是LRU缓存?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: LRU(最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高 实现:使用一个链表保存缓存数据,将新数据插入到头部,每当缓存命中时,则将命中的数据移动到链表头部,当链表满的时候,将链表尾部的数据丢弃。

  • 本文向大家介绍Java实现简单LRU缓存机制的方法,包括了Java实现简单LRU缓存机制的方法的使用技巧和注意事项,需要的朋友参考一下 一、什么是 LRU 算法 就是一种缓存淘汰策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。 LRU是Least Recentl