Java におけるコードの最適化
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
空間計算量を理解することは、次のようなアプリケーションを構築する上で重要です
OutOfMemoryError のようなエラーでクラッシュしない記法は時間計算量と同じです。
代表的な計算量クラス:
O(1): 定数時間 - サイズに依存しないO(n): 線形時間 - 入力サイズに比例して増加O(n²): 二次時間 - 入力サイズの2乗に比例して増加public int findMax(int[] array) {
int max = Integer.MIN_VALUE;
for (int value : array) {
if (value > max) {
max = value;
}
}
return max;
}
整数配列の要素数が10個でも1,000万個でも、使用するメモリは変数 max 1つ分だけです
空間計算量は 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) -> 約40KBの追加メモリmultiplicationTable、O(n²) -> 約400MBの追加メモリ
忘れないでください:

Java におけるコードの最適化