【发布时间】:2016-12-08 13:49:10
【问题描述】:
我需要计算一个集合的所有排列,我有一个代码,但问题是它是线性的并且需要很多时间。
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 会按需创建下一个元素。
-
Streamplify 库为排列、组合、笛卡尔积等提供并行流。查看实现或直接在您的代码中使用它。
标签: java recursion parallel-processing combinations java-stream