Я рассматривал эту проблему с реализацией кэша LRU, где после того, как размер кеша заполнен, в последнее время используется последний элемент, который заменяется на новый элемент.
У меня есть две реализации:
1). Создайте две карты, которые выглядят примерно так.
std::map<timestamp, k> time_to_key
std::map<key, std::pair<timestamp, V>> LRUCache
Чтобы вставить новый элемент, мы можем поместить текущую временную метку и значение в LRUCache. Когда размер кеша заполнен, мы можем вырезать наименее новый элемент, найдя самую маленькую временную метку, присутствующую в time_to_key, и удалив соответствующий ключ из LRUCache. Вставка нового элемента - O (1), обновление метки времени - O (n) (потому что нам нужно выполнить поиск k, соответствующего временной отметке, в time_to_key.
2). У вас есть связанный список, в котором наименее недавно используемый кеш присутствует в голове, а новый элемент добавляется в хвост. Когда элемент приходит, который уже присутствует в кеше, node, соответствующий ключу этого элемента, перемещается в хвост списка. Вставка нового элемента - O (1), обновление метки времени - снова O (n) (потому что нам нужно перейти в хвост списка), а удаление элемента - O (1).
Теперь у меня есть следующие quesitons:
-
Какая из этих реализаций лучше для LRUCache.
-
Есть ли другой способ получить доступ к кэшу LRU.
-
В Java я должен использовать HashMap для реализации LRUCache
-
Я видел такие вопросы, как внедрение общего кэша LRU, а также такие вопросы, как реализация кеша LRU. Общий кеш LRU отличается от кеша LRU?
Спасибо заранее!
Eidt:
Другой способ (самый простой способ) реализовать LRUCache в Java - это использовать LinkedHashMap и переопределить функцию boolean removeEldestEntry (Map.entry).