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

0 ответов

Другие вопросы по тегам