Codeoptimierung in Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Die Speicherkomplexität zu verstehen, ist entscheidend, um Anwendungen zu bauen, die:
OutOfMemoryError vermeidenDie Notation ist identisch zur Zeitkomplexität.
Einige gängige Komplexitätsklassen:
O(1): Konstante Zeit – größenunabhängigO(n): Lineare Zeit – wächst mit EingabegrößeO(n²): Quadratische Zeit – wächst quadratisch mit Eingabegrößepublic int findMax(int[] array) {
int max = Integer.MIN_VALUE;
for (int value : array) {
if (value > max) {
max = value;
}
}
return max;
}
Ob unser Integer-Array 10 Elemente hat oder 10 Millionen: Wir brauchen nur Speicher für eine einzige Variable, max
Die Speicherkomplexität ist O(1) bzw. konstant
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 Elemente, brauchen wir Platz für n zusätzliche ElementeO(n), da der Zusatzspeicher linear mit der Eingabegröße wächstpublic 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 gleich 10, brauchen wir 100 Zellen; ist n 100, brauchen wir 10.000 ZellenO(n²)Speicher ist eine endliche Ressource!
Unsere vorherigen Beispiele in Aktion für eine Eingabegröße von 10.000 Elementen:
findMax, O(1) -> nur ein paar zusätzliche BytesdoubleValues, O(n) -> ca. 40 KB ZusatzspeichermultiplicationTable, O(n²) -> ca. 400 MB Zusatzspeicher
Nicht vergessen:

Codeoptimierung in Java