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