带阵列的 LRU - R&D

问题描述

为什么 LRU 使用链表?难道我们不能用数组来存储项目,所以使用最频繁的项目将存储在数组的前面,最少在数组的最后。

我能想到的不使用数组的唯一原因 - 是在删除/更新数组时,与链表相比,它的性能较低。

还有什么理由吗?

注意:- 这个问题是出于学术目的或研究目的,以便更好地了解 LRU。

解决方法

某些上下文:LRU 缓存是一种自定义数据结构,可以least r最近used快速访问的结果(这是有道理的,因为以消息传递应用程序为例 - 你不想等待 30 秒打开聊天,你希望最后 10 条消息立即出现,如果你想要更远的东西然后您可以从数据库中获取并等待)。

既然您已经提醒了这个重要的上下文,我们就可以了解为什么要使用链表: linkedlists vs arrays

鉴于您知道要插入/删除的内容(通常在使用 HashMap 时也能在恒定时间内获得),它通常会提供恒定的插入/删除时间。如果您必须不断地插入/删除数组,则数组大小调整(O(N))将对性能非常不利(请记住,我们不希望聊天消息永远加载),而从链表中删除则为很简单:

public void deleteNode(ListNode node) {
    node.val = node.next.val;
    node.next = node.next.next;
}

您可以使用数组,但效率不会那么高——但是还有更多使用链表的理由:我们希望保留一个结构,其中(在恒定时间)我们可以将最近使用请求列表节点添加到我们链表的前面(在头/哨兵虚拟节点之后)。这允许您拥有一个恒定时间 get() 方法。