我知道,也许标题有些混乱。但是,我的实际问题是我认为的基本问题。 我正在使用一个全新的LRU实现,因为我使用了一个索引表,该表将传入数据包的名称映射到CS中存储的数据包内容的索引。 如下所示,每个传入数据包都存储在CS中,并且可以通过索引表进行寻址。
现在我们知道,关于LRU,假设新的数据包到达了,它的索引必须设置为CS的最高值(零),并且它需要升级其他索引,因此需要将它们递增。 一种明显的解决方案是遍历索引表中的所有条目并对其进行递增。 是否有解决此问题的解决方案或结构?
答案 0 :(得分:2)
我在说明中看不到如何建立缓存顺序。但是要回答您的问题,可以将LRU存储方法的时间复杂度降低为O(1)。
经典的实现方法是拥有以下两个数据结构:
双向链接列表:用于缓存中的顺序。每个节点都存储一个数据元素(它扮演着内容存储的角色)。
HashMap ,它将每个键与指向链表中节点的指针相关联。 (它扮演索引表的角色)
因此,当您访问缓存中已存储的数据时,该数据必须位于列表的顶部,因此可以从链接列表中删除相应的节点(在O(1)时间内,因为您可以访问其上一个和下一个节点)节点)并将其存储在头部。
对于新数据,它更简单,只需将其存储在列表的开头,然后将(键,值)存储在哈希图中即可。