【问题标题】:Least Recently Used Cache that runs in constant time以恒定时间运行的最近最少使用的缓存
【发布时间】:2017-11-08 16:47:16
【问题描述】:

我正在尝试创建一个以恒定时间运行并遵循最近最少使用的驱逐策略的缓存。它使用哈希映射来存储数据,并使用链表来跟踪请求数据的顺序。头部是最近最少请求的,尾部是最近请求的。

除了当用户请求一个已经在缓存中的项目并且链表必须从列表中删除该项目并将其添加为尾部时,一切都在 O(1) 中工作。我如何实现一个系统,可以使最近请求的项目已经在缓存中,因此链表,O(1) 中的尾部?

【问题讨论】:

  • 如何让哈希映射在恒定时间内工作?

标签: java linked-list hashmap time-complexity


【解决方案1】:

这听起来像是双向链表的完美用例。如果你通过你的元素线程化一个双向链接而不是单向链接列表并且有一个虚拟的头和尾对象,你可以通过编写从列表中拼接出一个元素

elem.next.prev = elem.prev;
elem.prev.next = elem.next;

然后您可以通过编写将元素放在尾部

elem.next = tail;
elem.prev = tail.prev;
tail.prev = elem;
elem.prev.next = elem;

由于这里只有恒定数量的指针杂耍,所以它在 O(1) 时间内运行。

这种技术经常在操作系统内核中用于在不同的运行队列之间移动对象(如线程),因为它非常快。

【讨论】:

  • 我认为您的代码将在尾节点和尾节点之前的节点之间插入elem,而不是使其成为尾节点
  • @mangusta 是的,没错。我假设我们有一个虚拟的头尾节点,所以在物理列表末尾之前插入对应于在逻辑列表末尾插入。
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2012-01-09
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多