Bei Problemlösungen spielen zwei Faktoren eine wichtige Rolle:
Material:
Folien (Vortrag)
Die Zeit, die ein Algorithmus zur Lösung eines problems benötigt, hängtstark von der "Größe des Problems" ab. Eine Liste mit 100 Einträgen kann wesentlich schneller durchsucht werden als eine mit 1 Mio. Einträgen. Letztlich geht es dabei oft um die Frage, wie oft Schleifen wiederholt werden.
Heute schwelgt man im Speicherüberfluss und kaum einer macht sich noch Gedanken über den Speicherumfang, den man für ein Programm benötigt. Dabei gibt es zahlreiche Anwendenungen, denen nicht genügend Speicher zur Verfügung steht und die deshalb die langsame Festplatte als "Swap"-Speicher mitverwenden müssen. Kernstück eines schnellen Algorithmus ist deshalb auch, ob alle benötigten Daten im RAM Platz finden.
Unter der Komplexität eines Algorithmus versteht man den durchschnittlichen Aufwand eines Verfahrens bezögen auf die "Größe des Problems". Dabei spielen folgende Kriterien eine wichtige Rolle:
Gewöhnlich wird die Komplexität in der sogenannten O-Notation angegeben. Die Laufzeit T(n) wird dabei durch eine Funktion g(n) abgeschätzt, die als kleinste obere Schranke gewählt wird.
T(n) <= konst * g(n) für alle n>n0
Die Laufzeit hat dann die Komplexität O(g(n)).
Beispiel:
Die Suche eines Elements in einer Reihung besitzt die Komplexität O(n), da die Reihung im schlechtesten Fall ganz durchlaufen werden muss.
Auf jeden Fall kann die Laufzeit wie folgt abgeschätzt werden:
T(n) <= 1 * n ( mit g(n) = n )
Also ist die Komplexität O(n).
Beim Sortieren der Reihung mit dem (schlechten) Bubblesort-Algorithmus muss das Feld n² - mal durchlaufen werden. Dieser Algorithmus hat also die Komplexität O(n²). Auch die optimierte Version des Bubblesortalgorithmus besitzt diese Komplexität, da
T(n) = n*(n+1)/2 = n²/2 + n/2 <= 1*n² ( mit g(n) = n² )
Anmerkung: Für sehr große n spielt der Summand n/2 keine Rolle mehr, das Wachstum wird ausschließlich von n²/2 bestimmt. Da bei der Komplexität Faktoren (1/2) unberücksichtigt bleiben, ist die Komplexität des Bubblesort-Algorithmus O(n²).
Welche Komplexität besitzt die iterative Summenberechnung der ersten n Zahlen?
public long summe(int n) {
long sum = 0;
for (long i = 0; i < n; i++)
sum += i;
return sum;
}
Da die Berechnung der Summe über eine Zählschleife geht, ist die Komplexität O(n): eine Verdopplung von n führt zu einer Verdopplung der Laufzeit. Dieser lineare Anstieg wird durch eine Laufzeitmessung bestätigt.
In Java kann man über die Funktion System.currentTimeMillis() die aktuelle Systemzeit in Millisekunden abfragen. Tut man dies unmittelbar vor und nach dem Aufruf der Methode summe, dann ist die zeitdifferenz ein Maß für die Laufzeit. Die gemessene Zeit hängt zwar von der verwendeten Hardware ab, allerdings zeigt ein schnellerer Rechner prinzipiell ein ähnliches Verhalten (flacherer Anstieg).
Für 3-D-Grafiken müssen häufig Matrizenmultiplikationen durchgeführt werden. Die folgende Methode berechnet das Produkt zweier nxn-Matrizen.
public void matrixmultiplikation(int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
c[i][j] = 0;
for (int k = 0; k < n; k++)
c[i][j] = c[i][j] +a[i][k]*b[k][j];
}
}
Die Laufzeitmessung bestätigt die Komplexität O(n³) (die gestrichelte Linie entspricht der Potenzfunktion n³).

Aufgabe: