Einführung in die Algorithmik

Werbung
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
Herunterladen