【发布时间】:2012-01-09 03:19:50
【问题描述】:
如何设计一个最近使用的缓存?
假设您访问了一些项目。你需要设计一个数据结构来保存 这些项目。每个项目都与最近访问时间相关联。
每次访问一个项目时,在数据结构中检查它。如果该项目已在缓存中,则更新其访问时间。否则,将其插入缓存。缓存大小是固定的,如果已满,则删除最旧的项。
我的解决方案:
使用地图
初始化:使用 f(visitTime) 降序对地图进行排序。 O(nlg n)
如果一个项目被访问,用 O(lg n) 在地图中搜索它。
如果已经在地图中,更新时间 O(1)。排序地图 O(lg n)。
如果不是,则将其插入地图然后排序。 O(lg n)
如果地图大小>固定大小,删除最后一个元素O(1)。
另一种解决方案:
使用哈希表
排序 O(n lgn)。
如果一个项目被访问,用 O(1) 在 talbe 中搜索它。
如果已经在表中,更新时间O(1)。对表格进行排序 O(n lg n)。
如果不是,则将其插入表中,然后排序。 O(n lg n)
如果表格大小>固定大小,删除最后一个元素O(1)。
有更好的解决方案吗?在) ?
【问题讨论】:
-
“排序”是什么意思?为什么要对 (unordered_) 地图进行排序(并复制到哪里?)?线性搜索将找到最旧的要删除的项目。
-
您打算在这里使用多大的缓存? Big-O 处理渐近复杂性,但缓存通常足够小,以至于复杂性很少是唯一(甚至通常是最重要的)问题。
标签: c++ algorithm data-structures hash lru