コレクションのすべての順列を計算する必要がありますが、そのためのコードがありますが、問題は線形で時間がかかります。コレクションのすべての順列を並行して計算する
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;
}
私は並列に計算を実行しようとしています。
私は、再帰を使ってロジックを書いてから、並列呼び出しを並列実行することはできますが、どうすればいいのか正確には分かりません。
助けていただければ幸いです。
大規模なマルチコアプロセッサを搭載していない限り、並列計算が役に立ちません。しかし、Sreamがオンデマンドで次の要素を作成するため、Setの代わりに戻り値としてJava8 Streamを使用できる場合は役立ちます。 – pcjuzer
[Streamplify](https://github.com/beryx/streamplify)ライブラリは、置換、組み合わせ、デカルト積などの並列ストリームを提供します。 実装を見たり、コード内で直接使用したりしてください。 – siordache