Optimera kod i Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Att förstå minneskomplexitet är viktigt för att bygga applikationer som:
OutOfMemoryErrorNotationen är identisk med tidskomplexitet.
Vanliga komplexitetsklasser:
O(1): Konstant tid – oberoende av storlekenO(n): Linjär tid – växer med indata-storlekenO(n²): Kvadratisk tid – växer kvadratiskt med indata-storlekenpublic int findMax(int[] array) {
int max = Integer.MIN_VALUE;
for (int value : array) {
if (value > max) {
max = value;
}
}
return max;
}
Oavsett om heltalsarrayen har 10 eller 10 miljoner element använder vi bara minne för en enda variabel, max
Minneskomplexiteten är O(1), det vill säga konstant minnesåtgång
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 element behöver vi plats för n ytterligare elementO(n) eftersom det extra minnesbehovet växer linjärt med indata-storlekenpublic 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 är 10 behöver vi 100 celler; om n är 100 behöver vi 10 000 cellerO(n²)Minne är en begränsad resurs!
Våra tidigare exempel i praktiken, för en indata-storlek på 10 000 element:
findMax, O(1) -> bara några extra bytedoubleValues, O(n) -> ungefär 40 KB extra minnemultiplicationTable, O(n²) -> ungefär 400 MB extra minne
Kom ihåg:

Optimera kod i Java