Kurs:Algorithmen und Datenstrukturen/Vorlesung/Notation Komplexitätsklassen
Komplexitätsklassen
[Bearbeiten]Auf dieser Seite werden die Komplexitätsklassen behandelt.
Wir sagen sei Und wir sagen, ein Algorithmus mit Komplexität f(n) benötigt höchstens polynomielle Rechenzeit, falls es ein Polynom p(n) gibt, mit . Des weiteren sagen wir, dass ein Algorithmus höchstens exponentielle Rechenzeit benötigt, falls es eine Konstante gibt, mit .
Die Komplexitätsklassen sind:
der konstante Aufwand, das bedeutet der Aufwand ist nicht abhängig von der Eingabe | |
der logarithmische Aufwand | |
der lineare Aufwand | |
der quadratische Aufwand | |
der polynomiale Aufwand | |
der exponentielle Aufwand |
Wachstum
[Bearbeiten]f(n) | n=2 | ||||
ldn | 1 | 4 | 8 | 10 | 20 |
n | 2 | 16 | 256 | 1024 | 1048576 |
2 | 64 | 2048 | 10240 | 20971520 | |
4 | 256 | 65536 | 1048576 | ||
8 | 4096 | 16777200 | |||
4 | 65536 |
Zeitaufwand
[Bearbeiten]Nun stellen wir uns die Frage, wie groß bezüglich der Rechenschritte darf, oder kann ein Problem sein, je nach Komplexitätsklasse, wenn die Zeit T begrenzt ist? Wir nehmen an, dass wir pro Schritt eine Rechenzeit von brauchen. In der folgenden Tabelle steht T für die Zeitbegrenzung und G für die maximale Problemgröße.
G | T=1Min. | 1 Std. | 1 Tag | 1 Woche | 1 Jahr |
n | |||||
7750 | |||||
391 | 1530 | 4420 | 8450 | 31600 | |
25 | 31 | 36 | 39 | 44 |
Ein Beispiel ist für T=1 Min. :
Typische Problemklassen
[Bearbeiten]Aufwand | Problemklasse |
---|---|
für einige Suchverfahren für Tabellen (Hashing) | |
für allgemeine Suchverfahren für Tabellen (Baum-Suchverfahren) | |
für sequenzielle Suche, Suche in Texten, syntaktische Analyse von Programmen (bei "guter" Grammatik) | |
für Sortieren | |
für einige dynamische Optimierungsverfahren (z.B. optimale Suchbäume), einfache Multiplikation von Matrix-Vektor | |
für einfache Matrizen Multiplikationen | |
für viele Optimierungsprobleme (z.B. optimale Schaltwerke), automatisches Beweisen (im Prädikatenkalkül 1.Stufe) |
Literatur
[Bearbeiten]Da die Vorlesungsinhalte auf dem Buch Algorithmen und Datenstrukturen: Eine Einführung mit Java von Gunter Saake und Kai-Uwe Sattler aufbauen, empfiehlt sich dieses Buch um das hier vorgestellte Wissen zu vertiefen. Die auf dieser Seite behandelten Inhalte sind in Kapitel 7.3.3 zu finden.