如何使用STL实现LFU缓存?
我试图使用纯STL实现LFU(Least Frequently Used)缓存(我不想使用Boost!)。
要求是:
Key
与std::map
关联访问任何元素。 UsesCount
属性)。 UsesCount
)。 问题是:
std::vector
作为容器的项目( Key
, Value
, UsesCount
), std::map
作为容器的迭代器,用于关联访问的vector和std::make_heap
, std::push_heap
和std::pop_heap
作为优先队列实现在向量中,映射中的迭代器在堆操作后无效。 std::list
(或std::map
)而不是std::vector
, std::make_heap
等无法编译,因为它们的迭代器不支持aritmetic。 std::priority_queue
,那么我无法更新项目优先级。 问题是:
感谢您的见解。
使用*_heap
函数和向量进行make实现似乎非常合适。 尽管它会导致更新缓慢。 对于使用向量作为底层数据结构的每个容器,遇到的有关迭代器失效的问题都是正常的。 这也是boost :: heap :: priority_queue所采取的方法,但是它并没有为上述原因提供可变接口。 其他boost :: heap数据结构提供更新堆的能力。
有点奇怪:即使你能够使用std::priority_queue
你仍然会面临迭代器失效问题。
直接回答你的问题:你不会错过某些明显的东西。 std::priority_queue
并不像应该那样有用。 最好的方法是编写自己的支持更新的堆实现。 为了完全兼容STL(尤其是分配器感知)是相当棘手的,而不是一个简单的任务。 最重要的是,实现LFU缓存。
第一步,查看Boost实现来了解这个工作。 我不知道第二个参考实现。
为了解决迭代器失效问题,你总是可以选择间接到另一个容器中,尽管你应该尽量避免它,因为它会产生额外的成本并且会变得非常混乱。
比保留两种数据结构更简单一些:
O(n)
) std::nth_element
找到最差的10%( O(n)
) O(n log n)
) 因此,向缓存中添加新元素通常是O(log n)
,最坏情况是O(n log n)
,并且是O(log n)
。
在LFU缓存中去除最糟糕的10%可能会有点激烈,因为新条目必须达到90%或者被削减。 再次,如果你只删除一个元素,那么新的条目仍然需要在下一个新条目之前脱离底部,否则它们被切断,并且他们没有时间这样做。 所以,根据LFU为什么适合您的缓存策略,我对它的改变可能是错误的策略,或者它可能还是很好的。
链接地址: http://www.djcxy.com/p/10951.html上一篇: How to implement LFU cache using STL?
下一篇: How to handle if query parameter is null or empty in hibernate?