Я ищу структуру данных, которая работает аналогично хеш-таблице, но где таблица имеет ограничение по размеру. Когда количество элементов в хеше достигает предела размера, следует вызвать функцию отбраковки, чтобы избавиться от пар с наименьшим количеством возвращаемых ключей/значений в таблице.
Вот несколько псевдокодов, над которыми я работаю:
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;
}
}