Это решение имеет сложность O (N 3 log 2 N) (может быть оптимизировано до O (N 3 log N)).Потребуется дополнительный массив целых чисел размером 2 * 8 * N 3 .
- Вычислить r (i, j, k): для каждого из N 2 строк, вычислить совокупную сумму всех ненулевых элементов, сбросив ее при обнаружении нулевого элемента.
- Выполните следующие шаги для различных значений K, используя Поиск золотого сечения (или поиск Фибоначчи), чтобы найти максимальный результат.
- Вычислить c (i, j, k): для каждого из столбцов N 2 вычислить накопленную сумму всех элементов с помощью r (i, j, k)> = K, сбрасывая его, когда найден элемент с r (i, j, k) этот ответ .
- Выполните последний шаг для различных значений M, используя поиск по Золотому сечению, чтобы найти максимальный результат.
- Вычислить сумму: для каждого из N 2 значений 3-й координаты рассчитать накопленную сумму всех элементов с помощью c (i, j, k)> = M, сбросив ее, когда элемент с c (i,j, k) K M и при необходимости обновите лучший на данный момент результат.
Свойство «пересечь границу» массива обрабатывается очевидным образом: дважды повторяйте каждый индекс и сохраняйтевсе кумулятивные суммы не больше N.
Для многомерного случая этот алгоритм имеет O (N D log D-1 N) временную сложность и O (D *)N D ) Пространственная сложность.
Оптимизация до O (N 3 log N)
Шаг 4 алгоритма устанавливает глобальныйзначение для M. Этот шаг может быть исключен (и сложность уменьшена на log N ), если значение для M определено локально.
Для этого необходимо улучшить шаг 5.Он должен поддерживать двустороннюю очередь (заголовок которой содержит локальное значение M) и стек (сохраняя начальные позиции для всех значений M, исключенных из очереди).
Пока c (i, j,k) увеличивается, добавляется к хвосту очереди.
Если c (i, j, k) уменьшается, все большие значения удаляются из хвоста очереди.Если он еще больше уменьшается (очередь пуста), стек используется для восстановления значения «сумма» и помещения в очередь соответствующего значения «М».
Затем из заголовка очереди может быть удалено несколько элементов (ипомещается в стек), если это позволяет увеличить значение локального решения.
Для многомерного случая эта оптимизация дает сложность O (N D log D-2 N).