Оптимизация кода на Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Понимание пространственной сложности важно для приложений, которые:
OutOfMemoryErrorНотация идентична нотации временно́й сложности.
Распространённые классы сложности:
O(1): константное время — не зависит от размера входных данныхO(n): линейное время — растёт пропорционально размеру входных данныхO(n²): квадратичное время — растёт квадратично с размером входных данныхpublic int findMax(int[] array) {
int max = Integer.MIN_VALUE;
for (int value : array) {
if (value > max) {
max = value;
}
}
return max;
}
Независимо от того, содержит ли массив 10 или 10 миллионов элементов, мы используем память только для одной переменной — max
Пространственная сложность равна O(1), то есть константная
public int[] doubleValues(int[] array) {
int[] result = new int[array.length];
for (int i = 0; i < array.length; i++) {
result[i] = array[i] * 2;
}
return result;
}
n элементов, нам потребуется место ещё для n элементовO(n): дополнительная память растёт линейно с размером входных данныхpublic int[][] multiplicationTable(int n) {
int[][] table = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
table[i][j] = (i + 1) * (j + 1);
}
}
return table;
}
n = 10 нужно 100 ячеек; при n = 100 — уже 10 000 ячеекO(n²)Память — ограниченный ресурс!
Предыдущие примеры в действии при размере входных данных 10 000 элементов:
findMax, O(1) -> всего несколько байт дополнительной памятиdoubleValues, O(n) -> около 40 КБ дополнительной памятиmultiplicationTable, O(n²) -> около 400 МБ дополнительной памяти
Важно помнить:

Оптимизация кода на Java