Ускорение работы рекурсивного метода

203
11 января 2019, 10:40

Дан метод на Java. Данный метод рекурсивный, выполняет функцию поиска непересекающихся прямоугольников из списков ArrayList.

private static boolean mapSeparator(int index, Rect rectangle) {
    boolean isTrue = false;
    int vacationsSize = vacations.size();
    //добавление всех прямоугольников без пересечения
    if (index + 2 < vacationsSize) {
        if (!Vacation.getUniqueRect(rectangle).isEmpty()) { //если есть прямоугольники - сохраняем их, добавляем trueRect
            ArrayList<Rect> middleRects = new ArrayList<>(Vacation.getUniqueRect(rectangle));
            trueRects.add(middleRects.get(0));
            for (Rect middleRect : middleRects) {//закидываем каждый middleRect в следующий шаг
                trueRects.set(index + 1, middleRect);//если из следующей не вернулся прямоугольник - заменяем middleRect
                if (mapSeparator(index + 1, middleRect)) {
                    return true;
                }
            }
            if (!isTrue) {
                trueRects.remove(index + 1);
            }
        } else {
            isTrue = false;//если нет нужных прямоугольников - возвращаем false
        }
    } else if (index + 1 < vacationsSize) {
        if (!Vacation.getUniqueRect(rectangle).isEmpty()) {
            trueRects.add(Vacation.getUniqueRect(rectangle).get(0));
            isTrue = true;
        }
    } else isTrue = true;//если дошли до конца - есть решение, возвращаем true
    return isTrue;
}

Суть работы метода: есть первый набор прямоугольников. Из них берется первый, к нему подбираются прямоугольники из второго набора. Далее из полученного набора берется так же первый прямоугольник, к которому идет подбор из третьего и т.д. Если не нашлось нужных прямоугольников из следующего набора - проверяется следующий прямоугольник. Из каждого набора должен вернуться 1 прямоугольник.

Необходимо ускорить работу данного метода. Как это можно сделать? Как вариант - замена рекурсии на итерацию, но как это можно осуществить и можно ли вообще?

READ ALSO
Шифр блочной одинарной перестановки Java

Шифр блочной одинарной перестановки Java

Только начал изучать Java, столкнулся с такой проблемойНеобходимо написать алгоритм блочной перестановки

161
ошибка при использовании EnvelopedSignature.open (error msg: &ldquo;output cipher initiation failed&rdquo;)

ошибка при использовании EnvelopedSignature.open (error msg: “output cipher initiation failed”)

Реализую шифрование сообщения с использованием класса EnvelopedSignature

181
Как использовать спринг-бины в expressions в Activiti (ServiceTask)?

Как использовать спринг-бины в expressions в Activiti (ServiceTask)?

Не получается использовать бины в выражения в Activiti (в ServiceTask)Он пишет, что не видит этот бин

129
Как сделать структуру блоков как на картинке?

Как сделать структуру блоков как на картинке?

Нужно таблицу из блоков как на картинке

167