Komplexität von Algorithmen
- Abschätzung des zeitlichen “Aufwands” eines Algorithmus in Abhängigkeit von der Anzahl n der Elemente
- “Aufwand”: Anzahl der “einfachen Operationen” (z.B. Wertzuweisung, Berechnung, Eingabe, Ausgabe, …)
- konstante Faktoren werden in der Regel ignoriert
- im Allgemeinen wird der “schlimmste Fall” betrachtet, d.h. der Fall mit dem größten Aufwand
- worst case: schlimmster möglicher Fall
- best case: bester möglicher Fall
- average case: durchschnittlicher Fall
Komplexitätsklassen
- logarithmisch:
- linear - logarithmisch:
- linear:
- konstant:
- potentiell:
- exponentiell:
Beispiele:
Bsp. 1:
for (int i = 0; i < n; i++){
System.out.println(i);
}linear:
Bsp. 2:
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
k = j*i;
}
}potentiell:
Bsp. 3:
for (int i = 0; i < n; i++){
for (int j = 0; j < 1000; j++){
k = j*i;
}
}linear, da innere Schleife von n unabhängig ist:
Bsp. 4:
for (int i = 0; i < n; i++){
x = i*i;
}
for (int j = 0; j < n; j++){
k = j*j;
}linear, da schleifen nicht ineinander geschachtelt:
Bsp. 5:
for (int i = 0; i < n*n; i++){
for (int j = n/2; j < n; j++){
k = j*i;
}
}potentiell:
Bsp. 6:
for (int i = 0; i <= n; i++){
for (int j = 0; j < i; j++){
}
}potentiell Durchläufe konstante Faktoren entfernen und nur den höhsten Faktor aufschreiben:
Bsp. 7:
linear - logarithmisch: Kommt vor bei: Quicksort, Binärsuche, Suche in Binärbaumen