26.12.2014 Aufrufe

03 O-Notation, Laufzeit und Komplexität - Medieninformatik

03 O-Notation, Laufzeit und Komplexität - Medieninformatik

03 O-Notation, Laufzeit und Komplexität - Medieninformatik

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!