java - 递归组合生成器耗尽内存

时间:2017-01-05 03:35:17

标签: java combinations

我有一种方法可以从列表列表中查找值的所有组合。目前,它可能会导致以下错误:OutOfMemoryError: GC overhead limit exceeded。它适用于小型数据集,但是对于较大的数据集会发生错误。有人可以告诉我如何修复我的算法吗?

我的代码如下:

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);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您还可以通过提供参数-Xms来尝试增加Java虚拟机的内存。如果从eclipse运行,可以在Eclipse主目录中的eclipse.ini文件中指定。您可以将参数-Xms128m更改为-Xmx512m。另一种替代方法是尝试将输入拆分为较小的块以用于递归方法,从而遵循mapreduce模式。

答案 1 :(得分:0)

为了解决这个问题,我更好地利用BiFunction参数来排除创建时更多无效的组合集。