caching - 如何实现动态索引?

标签 caching indexing data-structures lru

我知道,也许标题有点令人困惑。然而,我认为我的实际问题是基本的。 我正在开发一个全新的 LRU 实现,我使用索引表将传入数据包的名称映射到 CS 中存储数据包内容的索引。 如下所示,每个传入数据包都存储在 CS 中,并且可以通过索引表进行寻址。 enter image description here

现在假设新数据包到达,正如我们所知,对于 LRU,其索引必须设置为 CS 的顶部(零),并且需要升级其他索引,因此它们需要递增。 enter image description here 一种明显的解决方案是循环索引表中的所有条目并递增它们。 是否有任何解决方案或结构可用于解决此类问题?

最佳答案

我不明白你如何在描述中建立缓存的顺序。但为了回答你的问题,可以将 LRU 存储方法的时间复杂度降低到 O(1)。

经典的方法是使用以下两种数据结构:

  • 双向链表:用于缓存中的顺序。每个节点存储一个数据元素(它扮演内容存储的角色)。

  • HashMap 将每个键与指向链表中节点的指针相关联。 (它起到索引表的作用)

因此,当您访问缓存中已存储的数据时,它必须位于列表的顶部,因此您从链表中删除相应的节点(在 O(1) 时间内,因为您可以访问其上一个和下一个节点)并将其存储在头部。

对于新数据更简单,只需将其存储在列表的头部并将您的(键,值)存储在 HashMap 中。

关于caching - 如何实现动态索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59198623/

相关文章:

c# - 输出缓存不适用于 AJAX varyByParam

MySQL - 支持一个或多个值的索引不能为 NULL

java - 更好的数据结构,可以更快地读取 Map of Map of Map of Lists

sql - 转换为日期时未使用 PostgreSQL 时间戳索引

ruby-on-rails - Rails - 多索引键关联

c++ - 在这四个库中,您最有可能使用哪个?

java - 比较具有精确值匹配和相似值匹配的两个列表(使用 Java)

javascript - 当 window.location=self.location 不起作用时通过 AJAX 重新加载页面

ios - SDWebImage 没有缓存到磁盘

c# - NHibernate - Memcached 性能不佳