Comments 9
А чем двусвязный список + hash не угодил, зачем хранить время?
+6
Ну да это и есть ответ на вопрос, просто исходный LRU описывается именно с временами. Да и мне кажется, что проще понять.
0
По-моему, стопка листов, в которую новый кладем сверху, а самый старый забираем снизу, понятнее.
0
Варианты с одной очередью не очень хороши — однократно запрошенные элементы будут вытеснять чуть менее популярные элементы, которые запрашивали много раз. В интернетах встречаются статьи про кэши 2Q, где эта проблема частично решена: хэш-таблица для поиска элементов и 2 очереди. Сначала элемент попадает в нижнюю очередь, а если его запросили второй раз и он всё ещё в кэше — то тогда в верхнюю. Когда верняя очередь заканчиваются — элементы из неё вытесняются в нижнюю, из нижней же элементы вытесняются совсем и удаляются из кэша. Получается константное время поиска записи и её добавления
Кстати, в бусте есть контейнер, который отлично подходят для подобных схем — intrusive list. Ну и ещё intrusive hashmap, чтобы уж совсем минимально с памятью работать.
Кстати, в бусте есть контейнер, который отлично подходят для подобных схем — intrusive list. Ну и ещё intrusive hashmap, чтобы уж совсем минимально с памятью работать.
+3
О том какие готовые решения предоставляет Java можно почитать в статье Java LRU Cache
0
А как решаем проблему консистентности?
0
зачем решение с log(n), когда на листе и хеше элементарно сделать за n?
0
Sign up to leave a comment.
LRU, метод вытеснения из кэша