我正在尝试创建一个在恒定时间内运行的缓存,并遵循最近最少使用的驱逐策略。它使用哈希映射来存储数据,并使用链表来跟踪数据的请求顺序。头部是最近请求的,尾部是最近请求的。
一切都在O(1)中工作,除非用户请求已经在缓存中的项目,并且链接列表必须从列表中删除该项目并将其添加为尾部。我如何实现一个系统,可以使最近请求的项目已经在缓存中,为此链接列表,尾部在O(1)?
答案 0 :(得分:2)
这听起来像双链表的完美用例。如果你通过你的元素线程化一个双向链接而不是单链接的列表并且有一个虚拟的头部和尾部对象,你可以通过编写
从列表中拼出一个元素。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)内运行。
这种技术通常在操作系统内核中用于在不同的运行队列之间移动线程之类的对象,因为它非常快。