Java: распараллелить цикл и слить результаты для расчета энтропии
У меня есть алгоритм, который делает следующее:
Учитывая, у меня есть массив array
длины n
Его цель - объединить определенные элементы на основе некоторого условия (в данном случае энтропии). Рассчитывает энтропию e_all
всего array
и рассчитывает энтропию e_merged
из array
где элемент n
а также n+1
объединены Это делается для каждой пары смежных элементов. Пара, где разница в e_all - e_merged
Самые большие помечены. Если происходит слияние, алгоритм снова применяется к новому array
с длиной n-1
,
Как видите, в худшем случае n^2 - 1
итерации и если n
большой, это может занять несколько минут или даже часов. Поэтому мне было интересно, как я могу распараллелить эти алгоритмы. По сути, он должен быть в состоянии рассчитать энтропии на i
ядра и когда все элементы оценены, результаты должны быть объединены, и можно сделать вывод.
Как я могу сделать такую вещь? Какие части кода или идеи я должен реализовать, чтобы это работало таким образом? Или есть лучший способ?
public double[] applyAlgorithm(double[] array) {
boolean merging = false;
for (int i = 0; i < array.length - 1; i++) {
double[] entropy = getEntropy(array); // returns list of entropy for all adjacent intervals
int idx = 0;
double max = Double.NEGATIVE_INFINITY;
for (int j = 0; j < entropy.length; j++) {
if (entropy[j] > max) {
max = entropy[j];
idx = j;
}
}
if (max > 0) {
array = mergeAdjacentIntervals(array, idx); //merge intervals that have the max entropy, if the entropy is > 0
merging = true;
break;
}
}
if (merging) {
array = applyAlgorithm(array);
}
return array;
}
private double[] getEntropy(double[] array) {
double[] entropy = new double[array.length - 1];
double[] tempArray = new double[array.length - 1];
double baseEntropy = calculateEntropy(array);
for (int i = 0; i < entropy.length; i++) {
tempArray = mergeAdjacentIntervals(array, idx);
entropy[i] = baseEntropy - calculateEntropy(tempArray);
}
return entropy;
}