03 O-Notation, Laufzeit und Komplexität - Medieninformatik
03 O-Notation, Laufzeit und Komplexität - Medieninformatik
03 O-Notation, Laufzeit und Komplexität - Medieninformatik
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Laufzeit</strong> <strong>und</strong> Komplexität<br />
●<br />
●<br />
<strong>Laufzeit</strong> eines Algorithmus<br />
– Benchmarking versus Analyse<br />
– Abstraktion Rechenzeit, Anzahl Schritte<br />
– Bester, Mittlerer, Schlechtester Fall<br />
– Beispiel: Lineare Suche<br />
Komplexitätsklassen <strong>und</strong> O-<strong>Notation</strong><br />
– Problemgröße<br />
– Vernachlässigung nicht relevanter Teile, O-<strong>Notation</strong><br />
– Wichtige Komplexitätsklassen <strong>und</strong> typische <strong>Laufzeit</strong>en<br />
– <strong>Laufzeit</strong>analyse von Algorithmen<br />
– Beispiele: Binäre <strong>und</strong> lineare Suche<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 1
Motivation – Suchen<br />
●<br />
Wie schnell kann man suchen<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 2
Suche in einem Feld<br />
●<br />
●<br />
Ein Feld (Array) a<br />
– Mit n Elementen<br />
im Beispiel n=10<br />
– Indiziert von 0 bis n-1<br />
im Beispiel 0 bis 9<br />
– Aufsteigend sortiert<br />
für alle 0 ≤ pos ≤ n-1:<br />
a[pos] ≤ a[pos+1]<br />
Problemstellung<br />
– Suche ein vorgegebenes<br />
Element s in a<br />
– Bestimme Index pos,<br />
so dass a[pos] gleich s<br />
<strong>und</strong> gebe pos zurück<br />
– Falls s nicht in dem Feld<br />
gebe n zurück<br />
a<br />
s<br />
Problem: Suche in einem Feld<br />
Eingabe: Feld a mit n Elementen<br />
Suchwert s<br />
Ausgabe: pos falls ein pos existiert mit<br />
a[pos] gleich s<br />
n sonst<br />
2 3 5 7 11 13 17 19 23 29<br />
42<br />
0 1 2 3 4 5 6 7 8 9<br />
Nicht enthalten,<br />
Rückgabe 10<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 3
Lineare Suche<br />
●<br />
Lineare Suche – Idee<br />
– Teste sequentiell (hintereinander)<br />
von links nach rechts alle<br />
Feldelemente auf Gleichheit<br />
mit Suchwert<br />
– Sobald gef<strong>und</strong>en breche ab<br />
a<br />
==<br />
2 3 5 7 11 13 17 19 23 29<br />
0 1 2 3 4 5 6 7 8 9<br />
s 42<br />
●<br />
Lineare Suche – Algorithmus<br />
– Initialisiere Indexvariable<br />
(Position) pos mit 0<br />
– Durchlaufe eine Schleife<br />
● Falls pos ein korrekter Index ist<br />
(innerhalb der Feldgrenzen)<br />
<strong>und</strong> das Element noch nicht<br />
gef<strong>und</strong>en wurde<br />
● Erhöhe pos um 1<br />
– Gebe pos zurück<br />
# Lineare Suche<br />
pos = 0<br />
while pos < n and a[pos] != s:<br />
pos = pos+1<br />
return pos<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 4
<strong>Laufzeit</strong>betrachtung mit Anzahl Schritten<br />
●<br />
●<br />
Benchmarking nicht aussagekräftig<br />
– Implementieren des Algorithmus in spezifischer Programmiersprache<br />
– Testen mit verschiedenen Eingaben<br />
– Probleme<br />
● Abhängig von Hardware, Sprache, Compiler, Implementierungsdetails,<br />
Testauswahl<br />
● Ausführen auf doppelt so schnellem Rechner macht Algorithmus nicht<br />
besser/effizienter<br />
Besser: Anzahl der Einzelschritte<br />
– Einzelschritt als abstrakte Zeiteinheit<br />
– Bestimmung der Anzahl der Einzelschritte<br />
– Unabhängig von Hardware, Implementierungsdetails (Sprache,<br />
Compiler)<br />
– Probleme, z.B. Testauswahl<br />
● Im Beispiel ist Element nicht im Feld, also werden alle Elemente getestet<br />
● Was passiert, wenn das Element im Feld ist<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 5
<strong>Laufzeit</strong>betrachtung Lineare Suche<br />
●<br />
●<br />
Analyse Schritte konkretes Beispiel<br />
– Zuweisung<br />
– 10 Schleifendurchläufe a<br />
4 Einzelschritte<br />
● Zwei Tests<br />
● Feldzugriff<br />
● Addition<br />
– Letzter Test<br />
– Rückgabe<br />
Anzahl Schritte<br />
– 1 + 10·4 + 2 = 43 Schritte<br />
a<br />
s<br />
2 3 5 7 11 13 17 19 23 29<br />
42<br />
0 1 2 3 4 5 6 7 8 9<br />
# Lineare Suche<br />
pos = 0<br />
while pos < n and a[pos] != s:<br />
pos = pos+1<br />
return pos<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 6
Abstraktionen für die <strong>Laufzeit</strong>betrachtung<br />
●<br />
●<br />
Abstraktion vom Rechner <strong>und</strong> der konkreten Implementierung<br />
– Berechnen der Anzahl der Einzelschritte<br />
– Basierend auf abstrakter Maschine,<br />
möglichst nahe an realer Hardware für Realisierung Einzelschritt<br />
– Definition eines Einzelschritts<br />
zum Beispiel Zuweisung, Addition, Vergleich, ...<br />
Abstraktion von konkreten Problemen<br />
– Allgemeine Beschreibung der Eingabeobjekte<br />
statt konkrete Werte<br />
– Festlegung der Größe der Eingabeobjekte,<br />
zum Beispiel Feldgröße n<br />
– Aussagen über besten, mittleren, schlechtesten Fall<br />
zum Beispiel Element gef<strong>und</strong>en, Element nicht gef<strong>und</strong>en<br />
– Aussagen für große n,<br />
Vernachlässigung von Bestandteilen die unabhängig von n sind<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 7
Größe der Eingabeobjekte<br />
●<br />
●<br />
Abstraktion von konkreter Menge an möglichen<br />
Eingabeobjekten<br />
– Das Wesentliche ist meist die Größe<br />
– Kein einheitliches Maß möglich – ein „irgendwie“ hergeleitetes n<br />
– Meist in Zusammenhang mit Problemstellung<br />
Beispiele<br />
– Feldgröße n (oder Anzahl der Elemente) für Suchen <strong>und</strong> Sortieren<br />
– Gleichungssysteme mit m Gleichungen <strong>und</strong> k Unbekannten,<br />
für n kann m·k gewählt werden, die Anzahl der Koeffizienten<br />
– Graphen,<br />
für n zum Beispiel Anzahl der Knoten oder Anzahl der Kanten<br />
– ...<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 8
Bester, mittlerer, schlechtester Fall<br />
●<br />
●<br />
●<br />
Bester Fall<br />
– Konstruktion einer spezifischen Eingabe<br />
– Mit der minimal möglichen Anzahl von Schritten<br />
– Meist nicht charakteristische Aussage<br />
Mittlerer Fall<br />
– Bei allen möglichen Eingaben,<br />
(oder mit Nebenbedingungen auf relevante Eingaben beschränkt)<br />
– Durchschnittliche Anzahl von Schritten über alle diese Eingaben<br />
– Interessante <strong>und</strong> schwierigste Aussage<br />
Schlechtester Fall<br />
– Konstruktion einer spezifischen Eingabe<br />
– Mit der maximal möglichen Anzahl von Schritten<br />
– Relevante <strong>und</strong> meist machbare Aussage<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 9
Lineare Suche – Bester Fall<br />
●<br />
●<br />
●<br />
●<br />
Eingabe<br />
– s = a[0]<br />
Analyse<br />
– Zuweisung<br />
– Schleife einmal mit<br />
● Vergleich<br />
● Feldzugriff<br />
● Vergleich<br />
– Rückgabe<br />
Anzahl Schritte<br />
– 1 + 3 + 1 = 2 + 3 = 5 Schritte<br />
Bester Fall<br />
– Immer 5 Schritte<br />
– Unabhängig von Feldgröße<br />
a<br />
s<br />
2 3 5 7 11 13 17 19 23 29<br />
2<br />
0 1 2 3 4 5 6 7 8 9<br />
# Lineare Suche<br />
pos = 0<br />
while pos < n and a[pos] != s:<br />
pos = pos+1<br />
return pos<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 10
Lineare Suche – Schlechtester Fall<br />
●<br />
●<br />
●<br />
●<br />
Eingabe<br />
– s nicht im Feld<br />
s ≠ a[pos] für alle 0<br />
Analyse<br />
– Zuweisung<br />
– Schleife n-mal mit<br />
● Vergleich<br />
● Feldzugriff<br />
● Vergleich<br />
● Addition<br />
– Letzter Vergleich<br />
– Rückgabe<br />
Anzahl Schritte<br />
≤<br />
pos < n<br />
– 1 + 4·n + 2 = 3 + 4·n Schritte<br />
Schlechtester Fall<br />
– Immer 3+4·n Schritte<br />
a<br />
s<br />
2 3 5 7 11 13 17 19 23 29<br />
42<br />
0 1 2 3 4 5 6 7 8 9<br />
# Lineare Suche<br />
pos = 0<br />
while pos < n and a[pos] != s:<br />
pos = pos+1<br />
return pos<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 11
Lineare Suche – Mittlerer Fall<br />
●<br />
●<br />
●<br />
●<br />
Eingabe<br />
– Annahme über Verteilung der Eingabeobjekte muss gemacht werden<br />
– Position von s im Feld, sowie s nicht im Feld, sind gleichverteilt<br />
Analyse<br />
– Falls s an der Position pos für 0 ≤ pos < n:<br />
<strong>Laufzeit</strong> = 2+4·pos + 3 = 5 + 4·pos<br />
– Falls s nicht enthalten: <strong>Laufzeit</strong> 3 + 4n<br />
Vereinfachende Annahme (Feld eins länger, s in a[n]): <strong>Laufzeit</strong> 5+4n<br />
– <strong>Laufzeit</strong> im Mittel ist (bei Gleichverteilung)<br />
Summe <strong>Laufzeit</strong>en für 0 ≤ pos ≤ n (inklusive nicht enthalten)<br />
geteilt durch n+1<br />
– Dies entspricht 5 + 2·n, Herleitung nächste Seite<br />
Anzahl Schritte: 5 + 2·n Schritte<br />
Mittlerer Fall<br />
– Im Schnitt 5 + 2·n Schritte<br />
– Ungefähr halb so viel wie im schlechtesten Fall (entspricht Intuition)<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 12
Herleitung Mittlerer Fall<br />
Summe der möglichen <strong>Laufzeit</strong>en<br />
durch Anzahl mögliche <strong>Laufzeit</strong>en<br />
n<br />
∑ i=0<br />
54⋅i<br />
n1<br />
Konstanten rausziehen<br />
Summe aufspalten<br />
n<br />
∑ i=0<br />
5<br />
n1 4⋅ ∑ i=0<br />
n1<br />
n<br />
i<br />
Summen auflösen<br />
Gauß (Induktionsbeweis)<br />
5⋅n1<br />
n1<br />
4⋅ n⋅n1<br />
2<br />
n1<br />
Vereinfachen<br />
5 4⋅n⋅n1<br />
2⋅n1<br />
Vereinfachen<br />
52⋅n<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 13
Aussagen über Algorithmenlaufzeit<br />
●<br />
●<br />
●<br />
●<br />
Man sucht nach relativen Aussagen über Skalierbarkeit<br />
– Bei Verdopplung der Eingabegröße<br />
braucht der Algorithmus doppelt so lang<br />
Interessant ist<br />
– Relative Lage<br />
– Für große n<br />
Beispiel<br />
– Schlechteste <strong>Laufzeit</strong> bei linearer Suche 3+4n<br />
– Vernachlässigen kleinerer Funktionsteile 4n<br />
– Vernachlässigen von Konstanten n<br />
Aussage<br />
– Bei Verdopplung von n doppelt so lange<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 14
Vernachlässigen kleiner Funktionsteile<br />
●<br />
●<br />
Vernachlässigen kleiner Funktionsteile – Idee<br />
– Aussagen von <strong>Laufzeit</strong>funktion für große n<br />
– Konzentration auf den am stärksten<br />
wachsenden Teil der Funktion<br />
Beispiel: 4n statt 3 + 4n<br />
– Für kleine n ist der Unterschied zwischen<br />
3 + 4n <strong>und</strong> 4n relativ groß<br />
● Bei n = 2 ist die Abweichung r<strong>und</strong> 20 Prozent<br />
● Aber bei ~ 1 Million Schritte pro Sek<strong>und</strong>e liegt der Fehler im<br />
Mikrosek<strong>und</strong>enbereich<br />
– Für große n ist der Fehler relativ zu der Zahl minimal<br />
● Schon bei n = 10,000 ist der Fehler<br />
kleiner als ein H<strong>und</strong>ertstel eines Prozents<br />
<strong>und</strong> die Gesamtlaufzeit noch kleiner als eine Sek<strong>und</strong>e<br />
– Je größer n, desto geringer der Fehler<br />
3+4n<br />
4n<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 15
Vernachlässigen von Konstanten<br />
●<br />
●<br />
Vernachlässigen von Konstanten<br />
– Aussagen von <strong>Laufzeit</strong>funktionen unabhängig von Hardware<br />
– Konstante Faktoren repräsentieren „Dauer eines Schritts“<br />
– Ignorieren von konstanten Faktoren<br />
Beispiel: n statt 4n<br />
– Der Unterschied zwischen 4n <strong>und</strong> n ist ein konstanter Faktor<br />
4n<br />
– Aussagen wie „Bei Verdopplung der Eingabegröße braucht der<br />
Algorithmus doppelt so lange“ werden dadurch nicht beeinträchtigt<br />
– Konstante Faktoren sind typischerweise abhängig von „weg<br />
abstrahierten“ Eigenschaften<br />
● n statt 4n könnte durch 4 mal schneller Maschine erreicht werden<br />
● Annahme, dass Einzelschritt nur ein Viertel Zeiteinheit braucht<br />
n<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 16
Zuordnung von Klassen zu Funktionen<br />
●<br />
●<br />
●<br />
Idee – Gruppieren von Funktionen<br />
– Vernachlässigen <strong>und</strong> Reduktion aufs Wesentliche<br />
– Wenn zwei Funktionen nach Vernachlässigung <strong>und</strong> Reduktion<br />
identisch sind, dann gehören Sie zu der gleichen Klasse<br />
– Namen für die wichtigsten Klassen<br />
– Formal O-<strong>Notation</strong> (asymptotisch obere Schranken)<br />
Beispiel: Lineare Suche<br />
– <strong>Laufzeit</strong>funktion T(n) = 2 + 4·n<br />
– Vernachlässigung: 2 + 4·n ➸ 4·n ➸ n, T(n) ist linear<br />
– 66 + 42·n ist auch linear<br />
Weitere Beispiele<br />
– 3 + 4·n + 5·n² ➸ 5·n² ➸ n² quadratisch<br />
– 987 + 98·n + 3·n³ ➸ 3·n³ ➸ n³ kubisch<br />
– 34 + 4·log n ➸ 4·log n ➸ log n logarithmisch<br />
– 987 + 98·n 98765 + 3·2 n ➸ 3·2 n ➸ 2 n exponentiell<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 17
O-<strong>Notation</strong><br />
●<br />
●<br />
T ∈ O(g)<br />
n 0<br />
≤ ·g(n)<br />
● gilt, dass T(n) c<br />
– Ab einem bestimmten n ist für<br />
ein bestimmtes c der Wert c·g(n)<br />
c·g(n)<br />
– T wächst nicht schneller als g<br />
– g ist eine asymptotische<br />
obere Schranke von T<br />
T(n)<br />
– Ab einem bestimmten n<br />
wächst g schneller als T<br />
immer größer als T(n)<br />
– Es existiert<br />
● eine Konstante c ≥ 0<br />
● eine Konstante n 0<br />
≥ 0<br />
● so dass für alle n ≥ n 0<br />
Formale Spezifikation T ∈ O(g)<br />
∃c≥0∃n 0<br />
≥0 ∀ n≥n 0<br />
: T n≤c⋅g n<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 18
O-<strong>Notation</strong> – Andere Symbole<br />
●<br />
●<br />
●<br />
Alternative Schreibweise: T = O(g)<br />
– Eigentlich T ∈ O(g), aber = <strong>Notation</strong> hat sich eingebürgert<br />
– Sprechweise bleibt, „T ist in O von g“<br />
– <strong>Notation</strong>sproblem<br />
– Achtung bei Gleichungsketten: Gleichheit gilt nicht!!!<br />
g = (T) genau dann wenn T = O(g)<br />
– g wächst mindestens so schnell wie T<br />
T = (g) genau dann wenn<br />
– T = O(g) <strong>und</strong> g = O(T)<br />
– T <strong>und</strong> g sind von der gleichen Wachstumsordnung<br />
– Sinnvoll für gute Abschätzungen<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 19
Rechnen mit der O-<strong>Notation</strong><br />
●<br />
●<br />
●<br />
●<br />
●<br />
Zugehörigkeit zu Komplexitätsklassen<br />
– f = O(f)<br />
– O(O(f)) = O(f)<br />
Ignorieren von Konstanten möglich, für c Konstante<br />
– c·O(f) = O(f)<br />
– O(c·f) = O(f)<br />
– O(f+c) = O(f)<br />
Addition (Maximum)<br />
– O(f) + O(g) = O(max(f,g))<br />
– O(c 0<br />
+ c 1<br />
n + c 2<br />
n 2 + ... + c k<br />
n k ) = O(n k )<br />
Multiplikation (bleibt Multiplikation)<br />
– O(f) · O(g) = O(f·g)<br />
Es gilt<br />
– O(1) < O(log(n)) < O (n) < O (n·log(n)) < O(n 2 ) < ... < O(2 n )<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 20
Einfluss auf die Analyse – Initialisierung<br />
●<br />
●<br />
Ignorieren von Konstanten<br />
– Einfache Initialisierung<br />
<strong>und</strong> Aufräumen kann<br />
ignoriert werden<br />
– f <strong>und</strong> h nicht von n abhängig,<br />
das heißt konstant<br />
Beispiel Lineare Suche<br />
– Initialisierung i = 0 ignorieren<br />
– Rückgabe ignorieren<br />
// Algorithmus A, Konstanten<br />
f<br />
g(n)<br />
h<br />
O(A) = O(f) + O(g) + O(h)<br />
= O(g)<br />
# Lineare Suche<br />
i = 0<br />
while i < n and a[i] != s:<br />
i = i+1<br />
return i<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 21
Einfluss auf die Analyse – Sequenz, Verzweigung<br />
●<br />
●<br />
●<br />
Verzweigung <strong>und</strong> Sequenz<br />
– Addition der Teile entspricht<br />
Maximum<br />
Sequenz<br />
– Bei hintereinander ausgeführten<br />
Algorithmenteilen wird der<br />
einfachere vernachlässigt<br />
Verzweigung<br />
– Abschätzung nach oben,<br />
Maximum der beiden<br />
Verzweigungsmöglichkeiten<br />
// Algorithmus A, Sequenz<br />
f<br />
g<br />
O(A) = O(f) + O(g)<br />
= O(max(f,g))<br />
// Algorithmus B, Verzweigung<br />
if t:<br />
f<br />
else:<br />
g<br />
h<br />
O(B) = O(t) + O(max(f,g)) + O(h)<br />
= O(max(t,f,g,h))<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 22
Sequenz, Verzweigung in Linearer Suche<br />
●<br />
●<br />
●<br />
●<br />
Einmaliger Durchlauf der while-Schleife<br />
Sequenz bei Durchlauf Schleife<br />
– Bei hintereinander ausgeführten Algorithmenteilen wird der einfachere<br />
vernachlässigt<br />
– Erster Vergleich, dann Feldzugriff, dann zweiter Vergleich, dann<br />
Addition<br />
– Alles konstant (O(1)), also gesamt konstant<br />
Verzweigung bei Abbruch Schleife<br />
– Maximum der beiden Verzweigungsmöglichkeiten<br />
– Entweder erster Test klappt nicht,<br />
oder zweiter Test klappt nicht<br />
– Alles konstant, also gesamt<br />
konstant<br />
Einmaliger Durchlauf<br />
while-Schleife ist O(1)<br />
# Lineare Suche<br />
i = 0<br />
while i < n and a[i] != s:<br />
i = i+1<br />
return i<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 23
Einfluss auf die Analyse – Schleife<br />
●<br />
●<br />
Schleife ist Multiplikation<br />
// Algorithmus A, Schleife<br />
– Häufigkeit in Abhängigkeit von n<br />
● n·O(n) = O(n)·O(n) = O(n²)<br />
in der Schleifenkörper<br />
durchlaufen wird<br />
while t:<br />
f<br />
– Multiplizieren mit dieser Häufigkeit O(A) = O(f) · Anzahl Durchläufe in<br />
– Annahme: O(t) ≤ O(f)<br />
Abhängigkeit von n<br />
– n-maliges Durchlaufen<br />
// Algorithmus A, for-Schleife<br />
– Mit n multiplizieren<br />
for i in 1..n:<br />
f<br />
– Beispiel<br />
● n-maliges Durchlaufen (for Schleife)<br />
O(A) = O(f) · n<br />
● Linearer Algorithmus f<br />
For-Schleife<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 24
Schleife in Linearer Suche<br />
●<br />
●<br />
Anzahl der Durchläufe<br />
– Im besten Fall 1 mal (O(1))<br />
– Im schlechtesten Fall n mal (O(n))<br />
– Im mittleren Fall n/2 mal (O(n))<br />
– Anzahl Durchläufe O(n)<br />
Zusammengefasst<br />
– Schleifenkörper O(1)<br />
– Anzahl Durchläufe O(n)<br />
– Initialisierung <strong>und</strong> Ende O(1)<br />
– Gesamt: O(n)<br />
# Lineare Suche<br />
i = 0<br />
while i < n and a[i] != s:<br />
i = i+1<br />
return i<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 25
O statt T<br />
●<br />
●<br />
●<br />
<strong>Laufzeit</strong> T(n)<br />
– T ist Funktion, die die Anzahl der Elementarschritte eines Algorithmus<br />
in Abhängigkeit der Eingabegröße n berechnet<br />
– Genau für konkrete <strong>Laufzeit</strong><br />
– Schwierig zu berechnen (viel Fallunterscheidung)<br />
– Nicht direkt aussagekräftig für Skalierungsaussagen<br />
Komplexität O(T(n))<br />
– Zuordnung einer <strong>Laufzeit</strong>funktion T zu einer Klasse von Funktionen<br />
– Ungenau für konkrete <strong>Laufzeit</strong><br />
– Viel leichter zu berechnen<br />
– Sofort aussagekräftig für relevante Skalierungsaussagen<br />
Aussagen über Effizienz von Algorithmen<br />
– Angabe von O(T(n)), asymptotische obere Grenze<br />
– Meist Angabe von f mit T(n) = (f), gleiches Wachstum<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 26
Bezeichnungen<br />
● O(1): konstant<br />
● O(log i<br />
(n)): logarithmisch (Basis i egal)<br />
● O(n): linear<br />
● O(n·log i<br />
(n)): keine Bezeichnung, trotzdem sehr wichtig!<br />
● O(n²): quadratisch<br />
● O(n³): kubisch<br />
● O(nk ): polynomiell (bzw. polynomiell begrenzt),<br />
beliebiges k<br />
● O(2n ): exponentiell<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 27
Typische <strong>Laufzeit</strong>en<br />
praktisch<br />
● Höhergradig polynomiell meist machbar<br />
Lösbaren<br />
● Exponentiell ist massiv unangenehm<br />
● Logarithmisch, linear <strong>und</strong> n·log(n)<br />
sind gut handhabbar<br />
polynomiell exponentiell<br />
Grenze des<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 28
Typische Beispiele in den Klassen<br />
● O(1): Feldzugriff, Hashing<br />
● O(log i<br />
(n)): Binäre Suche<br />
● O(n): Lineare Suche<br />
● O(n·log i<br />
(n)): Sortieren schnell<br />
● O(n²): Sortieren langsam, kürzeste Wege<br />
● O(nk ): Simplex (Praxis)<br />
● O(2n ): Simplex (Theorie), Aussagenlogik,<br />
Ganzzahlige Optimierung<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 29
Kritik<br />
●<br />
●<br />
O-<strong>Notation</strong> <strong>und</strong> vorgestellte Herangehensweise<br />
– Grobe Abschätzung<br />
– Gute Informationen für schlechtesten Fall <strong>und</strong> große Probleme<br />
(Skalierung)<br />
Praxis<br />
– Konstanter Faktor nicht berücksichtigt. Wichtig für Benutzerinteraktion<br />
ob 0,2 oder 2 Sek<strong>und</strong>en Wartezeit<br />
– Wenn Problemgröße beschränkt ist,<br />
kann ein laut O-<strong>Notation</strong> schlechteres Verfahren besser sein<br />
– Spezielle Hardware wird nicht berücksichtigt<br />
(nur implizit – Beispiel: Termauswertung als Elementaroperation)<br />
– Mittelwert kann wichtiger sein (Beispiel Simplex)<br />
● Mitdenken nicht vergessen! (Gilt öfter ;-)<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 30
Komplexität Problem/Algorithmus<br />
●<br />
●<br />
●<br />
●<br />
●<br />
Nicht verwechseln!<br />
– Verschiedene Lösungsalgorithmen für ein Problem möglich<br />
Komplexität eines Problems<br />
– Zugehörigkeit zur Komplexitätsklasse der <strong>Laufzeit</strong> des besten<br />
Algorithmus<br />
– Beispiel: Suche in sortiertem Feld, Komplexität O(log(n))<br />
Komplexität eines Algorithmus<br />
– Zugehörigkeit Komplexitätsklasse der <strong>Laufzeit</strong> dieses Algorithmus<br />
– Beispiel: Suche in sortierten Feld mit linearer Suche, Komplexität O(n)<br />
Komplexität eines Problems schwierig zu bestimmen<br />
Komplexität einer Problemklasse schwierig zu bestimmen<br />
– Bekanntestes Beispiel: P ≠ NP<br />
Beweis steht noch aus!!<br />
– P – Klasse Polynomieller Probleme<br />
– NP – Klasse Nichtdeterministisch Polynomieller Probleme<br />
(nur exponentielle Algorithmen zur Lösung bisher bekannt)<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 31
Suchen – Lineare Suche<br />
●<br />
●<br />
Suchen<br />
– Problemgröße: n,<br />
Anzahl der Feldelemente<br />
– Komplexität: O(n)<br />
● Beste: O(1)<br />
● Mittlere: O(n)<br />
● Schlechteste: O(n)<br />
– Keine Voraussetzungen an Liste<br />
Suchen in sortierter Liste<br />
– Wenn Liste sortiert,<br />
dann geht es besser...<br />
a<br />
s<br />
2 3 5 7 11 13 17 19 23 29<br />
42<br />
0 1 2 3 4 5 6 7 8 9<br />
# Lineare Suche<br />
pos = 0<br />
while pos < n and a[pos] != s:<br />
pos = pos+1<br />
return pos<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 32
Suchen in Sortierter Liste – Binäre Suche<br />
●<br />
●<br />
Suchen in sortierter Liste<br />
– Problemgröße: n,<br />
Anzahl der Feldelemente<br />
– Komplexität: O(log n)<br />
●<br />
Beste: O(1)<br />
● Mittlere: O(log n)<br />
● Schlechteste: O(log n)<br />
– Liste muss sortiert sein<br />
∀ 0≤in−1 :a[i]≤a[i1]<br />
Suche in sortierten <strong>und</strong><br />
unsortierten Feldern<br />
sind zwei unterschiedliche<br />
Probleme<br />
a<br />
s<br />
2 3 5 7 11 13 17 19 23 29<br />
42<br />
0 1 2 3 4 5 6 7 8 9<br />
# Binäre Suche<br />
li = 0<br />
re = n-1<br />
while re >= li:<br />
x = (li+re)/2<br />
if s == a[x]:<br />
return x<br />
if s < a[x]:<br />
re = x-1<br />
else:<br />
li = x+1<br />
return n<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 33
Binäre Suche – Beispiel<br />
●<br />
●<br />
Halbiere den Suchbereich<br />
Bis gef<strong>und</strong>en oder<br />
Suchbereich leer<br />
a<br />
s<br />
2 3 5 7 11 13 17 19 23 29<br />
18<br />
0 1 2 3 4 5 6 7 8 9<br />
# Binäre Suche<br />
li = 0<br />
re = n-1<br />
while re >= l:<br />
x = (li+re)/2<br />
if s == a[x]:<br />
return x<br />
if s < a[x]:<br />
re = x-1<br />
else:<br />
li = x+1<br />
return n<br />
li=0<br />
li=5<br />
li=5<br />
re=6<br />
li=re=<br />
6<br />
re=6<br />
li=7<br />
nicht<br />
gef<strong>und</strong>en<br />
re=9<br />
re=9<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 34
Binäre Suche – Rekursiv<br />
●<br />
●<br />
Rekursiver Algorithmus bs_rek<br />
– Aufruf mit bs_rek(0, n-1)<br />
– Reduktion auf Teilfeld,<br />
halbiere Problemgröße<br />
– Suche in Teilfeld,<br />
Löse halb so großes Problem<br />
– Terminierung wenn Teilfeld leer<br />
oder gef<strong>und</strong>en, Problem trivial<br />
Typische Rekursion<br />
– Löse Problem durch<br />
● Problemreduktion<br />
●<br />
Lösen des kleineren Problems<br />
durch rekursiven Aufruf<br />
– Abfangen trivialer Fall<br />
– Keine explizite Schleife mehr<br />
# Binäre Suche rekursiv<br />
# a, n vorhanden<br />
def bs_rek(li, re):<br />
if re < li:<br />
return n<br />
x = (li+re)/2<br />
if s == a[x]:<br />
return x<br />
if s < a[x]:<br />
return bs_rek(li, x-1)<br />
else<br />
return bs_rek(x+1, re)<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 35
Analyse der Binären Suche<br />
●<br />
●<br />
●<br />
●<br />
Betrachtung schlechtester Fall<br />
– Element nicht gef<strong>und</strong>en<br />
– Schleife wird beendet wenn li <strong>und</strong> re sich treffen<br />
– Wenn li <strong>und</strong> re sich treffen noch genau ein Durchlauf<br />
(konstant, ignoriert)<br />
Bei jedem Durchlauf wird Abstand von l <strong>und</strong> r halbiert<br />
– Initial ist der Abstand n<br />
– Beim zweiten Durchlauf n/2<br />
– Beim dritten Durchlauf n/4<br />
– ...<br />
– Schleife wird log(n) mal durchlaufen, O(log(n))<br />
[formal folgt]<br />
Anweisungen innerhalb Schleife konstant<br />
– Anweisungen sind unabhängig von n, also konstant<br />
– Einfluss Anweisungen wird ignoriert, O(1)<br />
Komplexität Binäre Suche: O(log(n))<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 36
Analyse Binäre Suche – Rekurrenz<br />
●<br />
●<br />
●<br />
●<br />
<strong>Laufzeit</strong> der binären Suche<br />
– Was ist T(n)<br />
Rekursiver Aufruf<br />
– Halb so großes Problem T(n/2)<br />
Anweisungen in Funktion<br />
– Unabhängig von n<br />
– Konstant c, O(1)<br />
Es gilt also<br />
T(n) = T(n/2) + c<br />
# Binäre Suche rekursiv<br />
# a, n vorhanden<br />
def bs_rek(li, re):<br />
if re < li:<br />
return n<br />
x = (li+re)/2<br />
if s == a[x]:<br />
return x<br />
if s < a[x]:<br />
return bs_rek(li, x-1)<br />
else<br />
return bs_rek(x+1, re)<br />
eine Rekurrenz-Beziehung<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 37
Auflösen der Rekurrenz<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
Lösen der Rekurrenz: T(n) = T(n/2) + c<br />
Annahme: T(1) konstant d, n = 2<br />
k<br />
T(2 k ) = T(2 k-1 ) + c<br />
= T(2 k-2 ) + c + c<br />
= T(2 k-3 ) + c + c + c<br />
...<br />
= T(2 k-k ) + k·c<br />
= d+ k·c<br />
T(2 k ) ~ k<br />
Es gilt log 2<br />
(2 k ) = k, Anzahl Ziffern Binärdarstellung<br />
Also ist <strong>Laufzeit</strong> für diesen Fall logarithmisch<br />
Beliebige n, obere Abschätzung mit nächster Zweierpotenz<br />
– Verlängern des Feldes auf das nächste 2 k , 2 k-1 < n ≤ 2 k<br />
T(n) ∈ O(log 2<br />
(n))<br />
da T(2 k-1 ) = T(2 k-2 ) + c<br />
da T(2 k-2 ) = T(2 k-3 ) + c<br />
Prof. Dr. Peter Barth<br />
<strong>Medieninformatik</strong> Algorithmen <strong>und</strong> Datenstrukturen 38