С точки зрения алгоритма, нет более эффективного способа оценить максимальное значение для фиксированных n, m для всех k.Это займет O (n * m * k) операций.
Теперь единственный способ повысить производительность - это найти улучшения в вашей реализации, особенно в хранилище трехмерной матрицы.
Использование List<Array>
является основной областью для улучшения.Вы склонны к проблемам с боксом (преобразование примитивных типов в объекты) и делаете больше вызовов функций, чем необходимо.
Сократите вашу трехмерную матрицу до массива примитивов:
int[] my3DArray = new int[n * m * l]; // Note I'm using l where you use k
Теперь внесите индекс в ваш массив в [i, j, k], используя следующее смещение:
int elementAtIJK = my3DArray[i + (n * j) + (m * n * k)];
Если вы просто используете массивы примитивов, вы должны увидеть определенное улучшение.
Редактировать:
На самом деле, в C # (и некоторых других языках) это очень легкодля реализации трехмерных массивов напрямую , например:
int[,,] my3DArray = new int[n,m,l];
int elementAtIJK = my3DArray[i,j,k];
Что гораздо проще, чем я описал вначале (но в конце дня внутренне переводится в одномерную форму).
Что делать, если 3-е измерение имеет разный размер ...
Теперь становится интереснее, если размер 3-го измерения значительно изменяется.Если он имеет известный максимум и не слишком велик, вы можете просто установить его на максимум и заполнить пустые значения нулями.Это просто и может удовлетворить ваши потребности.
Однако, если 3-е измерение может быть очень большим, все эти дополнительные сохраненные нули могут потратить много ценного пространства, а вам нужна Разреженная матрица представление.
Существуют разные механизмы хранения для разреженных матриц.Для ваших целей вы можете рассматривать ваш 3D-массив как 2D-матрицу с (n * m) строками и max (k) столбцами.Поскольку третье измерение различается по длине, в ваших столбцах много пустых мест.Это называется разреженной строкой, и стандартное хранилище данных для этого - «Сжатый разреженный ряд».Опять же, для производительности это может быть представлено только тремя примитивными массивами, массивом данных, массивом индексов строк и массивом указателей столбцов.В Интернете есть ресурсы, которые описывают реализацию КСО лучше, чем я, но, надеюсь, это укажет вам правильное направление.