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