复杂的 LRU 缓存?

Posted

技术标签:

【中文标题】复杂的 LRU 缓存?【英文标题】:Complexity LRU cache? 【发布时间】:2015-01-22 10:08:46 【问题描述】:

我需要获得缓存复杂度 O(log (n))。据说这种复杂性允许映射和列表。比如实现:

http://blackcat.ca/svn/trunk/lru_cache/src/lru_cache.h

但是在这个算法中,列表中存在这样的操作: List.splice() - 复杂度 O(n)。 List.erase() - 复杂度 O(n)。

这里人们说map和list的复杂度是O(log(n))。 https://***.com/a/3640392/3274299

为什么是 O(log(n))?必须有 O(n)。

【问题讨论】:

【参考方案1】:

“但是在这个算法中,存在列表这样的操作:List.splice() - 复杂度 O(n)。List.erase() - 复杂度 O(n)。”

不...您从哪里获得这些复杂性值?请记住,您不是使用键(即 O(n))搜索列表 - 而是使用地图查找列表中要操作的位置。

您发布的 lru_cache.h 代码仅在 cppreference list::splice overloads mentioned here 中使用了重载 (2),正如所记录的那样,它具有恒定的复杂性。

同样,erase 的使用是重载 (1) here,具有恒定的复杂性。

【讨论】:

谢谢。我不知道。 :)

以上是关于复杂的 LRU 缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Python高级算法和数据结构:LRU缓存的巧妙设计

LRU缓存机制的实现

图解数据结构与算法LRU缓存淘汰算法面试时到底该怎么写

LeetCode 146. LRU 缓存

设计可以变更的缓存结构(LRU)

看动画理解「链表」实现LRU缓存淘汰算法