【问题标题】:The complexity of the LRU cache algorithmLRU缓存算法的复杂度
【发布时间】:2015-01-18 18:17:41
【问题描述】:

我面前有一个任务来实现 LRU 缓存。而系统中最长的操作应该是O(log (n))。作为我的缓存,我使用std :: MAP。我仍然需要第二个容器来存储密钥 + 创建时间 - 按时间排序。当我需要将地址更新到缓存时,它应该在某个地方:

  • 按键查找O(log (n))
  • 删除到迭代器O(1)
  • 插入O(log (n)) 的新元素。

最老的成员必须自然居住在container.begin()

我只能使用 STL。

列表 - 不适合我。

list.find() - O (n)

优先队列 - 删除未实施的项目。

我认为理想情况下它可以存储在std::set

std::set<pair<KEY, TIME>>;

排序std::set:

struct compare
{
    bool operator ()(const pair<K, TIME> &a, const pair<K, TIME> &b)
    {
        return a.second < b.second;
    }
};

并在 std :: set 中找到一个键来编写查找该对的第一个元素的函数 - std::set&lt;pair&lt;KEY, TIME&gt;&gt;;

你怎么看?谁能告诉我这是否符合我指定的复杂性要求?

【问题讨论】:

    标签: algorithm caching c++11 stl


    【解决方案1】:

    是的,您可以使用 ma​​p 加上 set 来获得删除/更新/插入的复杂性为 O(logn)

    1. map 存储 key,value 对。

    2. set 应该按这个顺序存储 time,key (你做了相反的事情)。当缓存已满并且您想删除一个键时,它将与 it = myset.begin() 指向的集合中的元素相对应。

    话说你可以通过使用哈希+双链表来提高性能。

    【讨论】:

    • 使用哈希和列表是否将时间复杂度提高到 O(1) ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多