У меня есть способ найти все комбинации значений из списка списков. В настоящее время это может привести к следующей ошибке: OutOfMemoryError: GC overhead limit exceeded
. Он отлично работает для небольших наборов данных, но ошибка возникает для больших наборов данных. Может кто-нибудь сказать, как исправить мой алгоритм?java - Генератор рекурсивных комбинаций заканчивается из памяти
Мой код выглядит следующим образом:
public static <T> List<List<T>> generate(List<List<T>> input, BiFunction<List<T>, T, Boolean> function) {
List<List<T>> output = new ArrayList<List<T>>();
generate(input, 0, output, null, function);
return output;
}
private static <T> void generate(List<List<T>> input, int index, List<List<T>> output, List<T> current, BiFunction<List<T>, T, Boolean> function) {
int next = index + 1;
if (index == 0) {
current = new ArrayList<T>();
}
for (T i : input.get(index)) {
List<T> temp = new ArrayList<T>(current);
if (function == null || !function.apply(temp, i)) {
temp.add(i);
if (next >= input.size()) {
output.add(temp);
}
else {
generate(input, next, output, temp, function);
}
}
}
}
Кто сказал, что проблема с вашим алгоритмом? – shmosel
Скорее всего, ваша проблема в этой строке 'List temp = new ArrayList (current);' поскольку он копирует элементы в новый список. Любая причина, по которой 'current' не используется напрямую, не упаковывая его в' temp'? Также, если вы обрабатываете большие наборы данных, лучше не использовать рекурсию, так как java не имеет оптимизации хвостового вызова, и вы столкнетесь с ошибками Stackoverflow. –
kjsebastian
Вы рассчитали, сколько комбинаций возможно? Он быстро растет. – Nayuki