Мне нужно вычислить все перестановки коллекции, и у меня есть код для этого, но проблема в том, что она линейна и занимает много времени.Рассчитать все перестановки коллекции параллельно
public static <E> Set<Set<E>> getAllCombinations(Collection<E> inputSet) {
List<E> input = new ArrayList<>(inputSet);
Set<Set<E>> ret = new HashSet<>();
int len = inputSet.size();
// run over all numbers between 1 and 2^length (one number per subset). each bit represents an object
// include the object in the set if the corresponding bit is 1
for (int i = (1 << len) - 1; i > 0; i--) {
Set<E> comb = new HashSet<>();
for (int j = 0; j < len; j++) {
if ((i & 1 << j) != 0) {
comb.add(input.get(j));
}
}
ret.add(comb);
}
return ret;
}
Я пытаюсь выполнить вычисление параллельно.
Я, хотя и имею возможность написать логику с использованием рекурсии, а затем параллельно выполнить вызов рекурсии, но я не совсем уверен, как это сделать.
Поблагодарили бы за любую помощь.
Я не уверен, что параллельные вычисления помогут вам, если у вас нет массивного многоядерного процессора. Но если вы можете использовать Java8 Stream как возвращаемое значение вместо Set, это может помочь, потому что Sreams создают следующий элемент по требованию. – pcjuzer
Библиотека [Streamplify] (https://github.com/beryx/streamplify) предоставляет параллельные потоки для перестановок, комбинаций, декартовых продуктов и т. Д. Взгляните на реализацию или используйте ее прямо в коде. – siordache