复杂度 LRU 缓存?
Complexity LRU cache?
我需要得到缓存复杂度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))。
为什么是 O(log(n))?必须有 O(n).
"But in this algorithm are present such operations with the list: List.splice() - Complexity O(n). List.erase() - Complexity O(n)."
不……你从哪里得到这些复杂性值?请记住,您不是使用键(这将是 O(n))搜索列表 - 而是使用映射来查找列表中要操作的位置。
您发布的 lru_cache.h 代码仅在 cppreference list::splice overloads mentioned here 中使用重载 (2),如文档所述,它具有恒定的复杂性。
同样,erase
的使用是重载 (1) here,具有恒定的复杂性。
我需要得到缓存复杂度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))。
为什么是 O(log(n))?必须有 O(n).
"But in this algorithm are present such operations with the list: List.splice() - Complexity O(n). List.erase() - Complexity O(n)."
不……你从哪里得到这些复杂性值?请记住,您不是使用键(这将是 O(n))搜索列表 - 而是使用映射来查找列表中要操作的位置。
您发布的 lru_cache.h 代码仅在 cppreference list::splice overloads mentioned here 中使用重载 (2),如文档所述,它具有恒定的复杂性。
同样,erase
的使用是重载 (1) here,具有恒定的复杂性。