ProInformatik III - Tag 11 Dr. Marco Block-Berlitz Abschrift: Eduard Wolf 20. August 2012 Einführung in die Algorithmik Definition Algorithmus: • ist eine Menge von Regeln, die ein Problem löst • ist eine Menge von Anweisungen, die garantiert, in einer endlichen Anzahl von Schritten (terminiert), eine korrekte Lösung für jedes Beispiel eines gegebenen Problems findet • Sequenz von Schritten, die Eingabedaten in gewünschte Resultate überführt Beispiel Sieb des Eratosthenes 1 2 3 4 5 6 7 8 sieb (n ) : n o t i e r e a u f s t e i g e n d a l l e n a t ü r l i c h e n Zahlen von 2 b i s n k:=1 do m:= e r s t e n i c h t m a r k i e r t e Zahl g r ö ß e r a l s k m a r k i e r e V i e l f a c h e von m, a u ß e r m s e l b s t k:=m while ( k<s q r t ( n ) ) alle unmarkierten Zahlen sind Primzahlen Binäre Suche Gegeben sei eine aufsteigend sortierte Folge von Elementen ao , a1 , . . . , an−1 und ein gesuchtes Element x 1 1 2 3 4 5 6 7 8 9 10 11 12 13 binSuche ( a [ ] , x ) : i :=0 j :=n−1 while ( i<=j ) do m:= f l o o r ( ( i+j ) / 2 ) // i+f l o o r ( ( j −i ) / 2 ) i f ( x>a [m] ) i :=m+1 e l s e i f ( x<a [m] ) j :=m−1 else return m endwhile return −1 Vom Problem zur Lösung am Rechner Alle Probleme der Informatik haben etwas gemein: Das interne Verhalten basiert jeweils auf • der Darstellung: Bestimmung der symbolischen Kodierung der Informaiton, so dass diese effizient manipuliert werden kann. • der Transformation: die sukzessive Modizierung des Zustands durch das Abarbeiten des Algorithmus, mit dem Zweck, das gewünschte Resultat zu liefern Um für einen Algorithmus die Komplexität analysieren zu können, müssen wir entscheiden, auf welchem Rechnermodell er arbeiten soll. • Rechner Pentium III, 800 MHz, Dualcore,... • Programmiersprache Haskell, Java, Pascal, C++ • Compiler Es muss ein theoretisches, abstraktes Rechnermodell sein, Wir wählen eine Registermaschine: die RAM (Random Access Machine) [1963]. 1. Jede einfache (atomare, elementare) Operation wie z.B. +, −, ∗, /, =, if, . . . benötigt nur eine Zeiteinheit bzw. einen Schritt 2. Schleifen und Methoden sind keine elementaren Operationen, setzen sich aber aus diesen zusammen 3. Jeder Speicherzugriff dauert genau eine Zeiteinheit 4. Es gibt unbegrenzten Speicher Komplexität von Algorithmen Die Komplexität eines Algorithmus beschreibt dessen Kosten (Laufzeit, Speicher,. . . ). Meisten reicht der Speicher in der Praxis aus, sodass die Laufzeit das interessante 2 Komplexitätsmaß ist. Dieses kann anhand der Anzahl der elementaren Operationen berechnet werden. Diese hängt aber von der Dimension n der Eingabe ab: [x1 , x2 , . . . , xn ] Landau-Symbole Es gibt verschiedene Beschreibungsmöglichkeiten, um die Anzahl der Elementarschritte von der Größe der Eingabe anzugeben: O-Notation: Mit O-Notation geben wir eine obere Schranke für die Komplexität eines Algorithmus an. Wir drücken damit aus, das ein Algorithmus nicht schlechter ist als ein bestimmtes Maß. Mathematisch: f, g :: N → R+ Eine Funktion f (n) hat als obere Schranke g (n), wir schreiben dann f (n) ∈ O (g (n)), wenn es eine positive Konstante n0 ∈ N und c ∈ R+ gibt, so dass alle Werte von f (u) für alle n > n0 immer kleiner/gleich c ∗ g (n) sind. Wir schreiben dafür kurz f (n) ∈ O (g (n)): ∃n0 ∈ N, c ∈ R+ ∀n ≥ n0 : f (n) ≤ c ∗ g (n) Beispiel Angenommen wir haben für einen Algorithmus A die folgende Laufzeit ermittelt: A (n) : 3n4 + 5n3 + 7log (n) Jetzt wollen wir diesen Algorithmus mit B (n) vergleichen, der aber eine Laufzeit von n4 hat: B (n) = n4 Wir behaupten A(n) ∈ O (B (n)) Beweis: 3n4 + 5n3 + 7log (n) ≤ 3n4 + 5n4 + 7n4 ≤ 15n4 ist erfüllt für n ≥ 1. Daher können wir für c = 15 und n0 = 1 wählen 3