Я ищу структуру данных, которая работает аналогично хеш-таблице, но где таблица имеет ограничение по размеру. Когда количество элементов в хэше достигает предела размера, должна быть вызвана функция отбора, чтобы избавиться от наименее извлеченных пар ключ / значение в таблице.
Вот псевдокод того, над чем я работаю:
class MyClass {
private Map<Integer, Integer> cache = new HashMap<Integer, Integer>();
public int myFunc(int n) {
if(cache.containsKey(n))
return cache.get(n);
int next = . . . ; //some complicated math. guaranteed next != n.
int ret = 1 + myFunc(next);
cache.put(n, ret);
return ret;
}
}
Что происходит, так это то, что есть некоторые значения n
, для которых myFunc()
будет вызываться много раз, но многие другие значения n
будут вычисляться только один раз. Таким образом, кэш может заполняться миллионами значений, которые больше никогда не нужны. Мне бы хотелось, чтобы в кеше автоматически удалялись элементы, которые редко бывают найдены.
Это похоже на проблему, которая уже должна быть решена, но я не уверен, какую структуру данных я бы использовал, чтобы сделать это эффективно. Кто-нибудь может указать мне правильное направление?
Обновление Я знал, что это должна быть уже решенная проблема. Он называется LRU Cache и его легко сделать, расширив класс LinkedHashMap. Вот код, который включает в себя решение:
class MyClass {
private final static int SIZE_LIMIT = 1000;
private Map<Integer, Integer> cache =
new LinkedHashMap<Integer, Integer>(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest)
{
return size() > SIZE_LIMIT;
}
};
public int myFunc(int n) {
if(cache.containsKey(n))
return cache.get(n);
int next = . . . ; //some complicated math. guaranteed next != n.
int ret = 1 + myFunc(next);
cache.put(n, ret);
return ret;
}
}