Algorithmen und Datenstrukturen Prof. Dr. Sibylle Schwarz Westsächsische Hochschule Zwickau Dr. Friedrichs-Ring 2a, RII 263 http://www.fh-zwickau.de/~sibsc/ sibylle.schwarz@fh-zwickau.de SS 2013 1
Algorithmen Beispiel ggt (einfacher) Euklidischer Algorithmus zur Bestimmung des ggt zweier natürlicher Zahlen Algorithmus : Größter gemeinsamer Teiler Eingabe : a N, b N Ausgabe : ggt(a, b) solange a b : wenn a > b dann a a b sonst b b a Rückgabe a 2
Algorithmus endlich beschriebene schrittweise ausgeführte Arbeitsvorschrift zur Lösung eines Berechnungsproblemes, d.h. zur Transformation einer Eingabe in eine Ausgabe 3
Beispiele für Algorithmen historisch (Mathematik): Euklidischer Algorithmus Sieb des Erathostenes schriftliche Addition, Multiplikation usw. Gauß-Algorithmus im Alltag: Suchen eines Wörterbucheintrages Bauanleitung Kochrezept Orchester-Partitur in der Informatik: Programm-Quelltext Programm-Ablaufplan, Struktogramm Suchverfahren Sortierverfahren 4
Algorithmen und Datenstrukturen Informatik Wissenschaft von der Darstellung und Verarbeitung symbolischer Information Darstellung der Information als (strukturierte) Daten Verarbeitung der Information durch Algorithmen 5
Abstraktionsstufen Abstrakter DT Mathematik: Funktion (konkreter) DT algebraische Struktur Algorithmus Datenstruktur Implementierung: Funktion, Methode Typ, Klasse 6
Einordnung in die Informatik Teilgebiete der Informatik: theoretisch technisch Formalismen zur Darstellung von Daten und Algorithmen Möglichkeiten und Grenzen der Berechenbarkeit durch Algorithmen Grundlagen für technische und praktische (und angewandte) Informatik maschinelle Darstellung von Information Mittel zur Ausführung von Algorithmen praktisch Modellierung (Datenstrukturen) Entwurf von Algorithmen Programmierung, Softwaretechnik angewandt Modellierung durch geeignete Datenstrukturen Anwendung von Algorithmen (z.b. Suchen, Sortieren,... ) 7
Inhalt der Lehrveranstaltung Algorithmen Spezifikation Laufzeitabschätzungen rekursive Algorithmen Beispiele, z.b. Sortieralgorithmen abstrakte Datentypen mit häufigen Operationen: Mengen Folgen Zuordnungen (Wörterbücher) Relationen Datenstrukturen zu deren Realisierung: lineare Datenstrukturen (Listen, Stack, Queue, Hash-Tabellen) hierarchische Datenstrukturen (Bäume, Heaps) Graphen Algorithmen auf Graphen Pattern-Matching-Algorithmen 8
Literatur Cormen, Leiserson, Rivest, Stein: Algorithmen - Eine Einführung (Oldenbourg, 2007) Güting, Dieker: Datenstrukturen und Algorithmen (Teubner, 2004) Solymosi, Grude: Grundkurs Algorithmen und Datenstrukturen : eine Einführung in die praktische Informatik mit Java (Vieweg, 2000) Preiss: Data Structures and Algorithms with Object-Oriented Design Patterns in Java (Online-Version unter http://www.brpreiss.com/books/opus5/) 9
Organisation http://www.fh-zwickau.de/~sibsc/lehre/ss13/ad Montag 11:20-12:50 in R304 Vorlesung Donnerstag Z1 15:05-16:35 in R308 Hausaufgaben schriftliche Aufgaben (Prüfungsvorbereitung) Vorbereitung des Praktikums (Entwurf) Autotool-Aufgaben Übung für alle gemeinsam (Hörsaalübung) Donnerstag Z1 9:35-11:05 in PBS 203 Fragen zum Vorlesungsstoff Besprechung der schriftlichen Übungsaufgaben Praktika 2 Gruppen (Eintragen im Autotool): Montag 9:35-11:05 in Pool 242 (14-tägig) (einige) Autotool-Aufgaben Programmieraufgaben (Implementierung) Prüfung: Klausur ca. 60 min (Hälfte von 120 min für Modul PTI621) 10
Algorithmen in der Informatik Algorithmus: in Schritte geordnete Arbeitsvorschrift endliche Beschreibung eines schrittweise ausgeführten Verfahrens in einer formalen Beschreibungssprache. zur Ausführung eines Algorithmus ist nötig: Akteur / Maschine, welche den Beschreibungsformalismus interpretieren kann 11
Algorithmen Eigenschaften notwendige Eigenschaften: endliche Beschreibung schrittweise Ausführung oft wird außerdem gefordert (meist sinnvoll für auf Computer ausgeführten Algorithmen): deterministischer Ablauf : bei wiederholter Ausführung mit denselben Eingaben wird immer derselbe Ablauf ausgeführt terminierend (Endlichkeit der Ausführung): Berechnungsvorschrift terminiert gdw. jede Ausführung bei jeder erlaubten Eingabe nach endlich vielen Schritten endet determiniertes Ergebnis : bei wiederholter Ausführung mit denselben Eingaben wird immer dieselbe Ausgabe erzeugt allgemeingültig : löst eine ganze Klasse von Aufgaben 12
Beispiele Algorithmus : A1 Eingabe : y Z Ausgabe : y x Wähle beliebige Zahl x Z y x + 4 Algorithmus : A2 Eingabe : x Z Ausgabe : y y 1 solange x 0 : y yx x x 1 Algorithmus : A3 Eingabe : n N Ausgabe : n solange n > 1 : wenn n 2 0 dann n n/2 sonst n 3n + 1 Welche dieser Algorithmen sind deterministisch, terminierend, haben determiniertes Ergebnis? 13
Algorithmen zur Lösung eines Berechnungsproblemes Berechnungsproblem: Transformation von Eingaben in Ausgaben Anforderungen an Algorithmen zur Lösung eines speziellen Berechnungsproblemes: Korrektheit Algorithmus löst alle Instanzen des gegebenen Problems (fehlerfrei): bestimmt für jede Eingabe korrekte Ausgabe. Berechenbarkeit Zu jeder Eingabe ist eine eindeutige Ausgabe definiert und wird vom Algorithmus erzeugt. Nicht alle formulierbaren Algorithmen sind berechenbar. (hängt vom Problem und der Beschreibungssprache ab). mehr dazu in LV Theoretische Informatik Effizienz möglicht geringer Ressourcen-Verbrauch (Speicherplatz, Laufzeit) 14
Algorithmen-Entwicklung 1. informale Aufgabenstellung 2. formale Spezifikation: Was (welches Berechnungsproblem) soll gelöst werden? exakte (formale) Beschreibung des Problemes: Eingabe des Algorithmus Ausgabe des Algorithmus Zusammenhang zwischen Ein- und Ausgabe 3. Entwurf des Algorithmus: Wie soll es gelöst werden? formale Darstellung der Arbeitsschritte zu jedem Schritt: Was wird getan? (Aktionen, Anweisungen) Womit wird es getan? (Daten) Wie geht es weiter? (nächster Schritt) 4. Verifikation: Nachweis der Korrektheit des Algorithmenentwurfes 5. Realisierung (Implementierung) 15
Algorithmen Spezifikation Problemanalyse: Was soll gelöst werden? Ausgangspunkt: Ergebnis: umgangssprachlich formulierte und oft ungenaue Aufgabenbeschreibung exakte und vollständige Definition des Problemes Spezifikation eines Berechnungsproblemes: korrekte formale Beschreibung des Zusammenhanges zwischen Eingaben und Ausgaben Spezifikation eines Berechnungsproblemes enthält Vorbedingung: Forderung an die Eingaben Nachbedingung: Forderung an die Ausgaben Instanz eines Berechnungsproblemes: spezielle Eingabe 16
Beispiel: Spezifikation des Sortier-Problems informale Aufgabenstellung: Entwurf eines Verfahrens, welches jede Folge (x 1,..., x n ) natürlicher Zahlen sortiert formale Spezifikation dieses Sortier-Problemes: Vorbedingung: Eingabe (x 1, x 2,..., x n ) mit i {1,..., n} : x i N Nachbedingung: Ausgabe (y 1, y 2,..., y n ) ist 1. y 1 y 2 y n+1 (aufsteigend geordnet) und 2. eine Permutation (Umordnung) der Eingabe (x 1, x 2,..., x n ) Instanz dieses Sortier-Problemes: (34, 6, 72, 3, 4, 15) 17
Algorithmen Korrektheit... there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult. Tony Hoare, 1980 ACM Turing Award Lecture Ist der entworfene Algorithmus korrekt? Erfüllt der entworfene Algorithmus die Spezifikation? Verifikation: Nachweis, dass Entwurf die Spezifikation erfüllt sicherer (aber mitunter aufwendiger) als Testen Es gibt Verfahren / Systeme, die Verifikation automatisch ausführen oder unterstützen. mehr dazu im Master-Studium: LV Spezifikations- und Verifikationsmethoden 18
Effizienz von Algorithmen Aufwandsanalyse von Algorithmen abhängig von der Größe der Instanz unabhängig von konkreter Hardware im günstigsten Fall (best case) ungünstigsten Fall (worst case) Mittel (average case) Abschätzungen von Resourcenbedarf bei Ausführung des Algorithmus Zeitaufwand: Anzahl elementarer Rechenschritte auf einem idealisierten Rechnermodell (RAM) Speicherplatzbedarf 19
Algorithmenentwurf Algorithmus = in Schritte geordnete Arbeitsvorschrift endliche Beschreibung eines schrittweise von einem Aktuer ausgeführten Verfahrens in einer formalen Beschreibungssprache. Ziele beim Entwurf von Algorithmen: Korrektheit geringer Ressourcenverbrauch Laufzeit Speicherplatz sinnvoll strukturierte einfache formale Beschreibung (z.b. kurzer, lesbarer Programmcode) 20
Beispiel Summe der ersten n natürlichen Zahlen informale Aufgabenstellung: Addiere alle natürlichen Zahlen von 1 bis n. Spezifikation: Vorbedingung: Eingabe n N Nachbedingung: Ausgabe s = n i=1 i Algorithmus : A1 Eingabe : n N Ausgabe : s s 0 für jedes i 1,..., n : s s + i Algorithmus : A2 Eingabe : n N Ausgabe : s s n(n + 1)/2 21
(Idealisiertes) Rechnermodell Random-Access-Maschine (RAM) unendlich viele Speicherzellen für je eine natürliche Zahl (Alternative: Real-RAM für reelle Zahlen) Befehle: Laden Speichern Operationen (logisch, arithmetisch, Vergleiche) Unterprogrammaufrufe Ausführung jedes Befehles (elementare Anweisung, Schritt) dauert (kostet) genau eine Einheit sequentielle Ausführung aller Befehle 22
Laufzeitanalyse Laufzeit eines Algorithmus auf der Eingabe x: Anzahl der zur Ausführung des Algorithmus bei Eingabe x benötigten Einheiten (Schritte) Laufzeit T eines Algorithmus ist eine Funktion der Größe der Eingabe x Definition der Größe hängt vom Berechnungsproblem ab, z.b. Länge einer zu sortierenden Liste, Länge der Binärdarstellung zweier zu addierender Zahlen worst-case Maximum der Laufzeiten des Algorithmus über alle Eingaben obere Schranke für die Laufzeit best-case Minimum der Laufzeiten des Algorithmus über alle Eingaben untere Schranke für die Laufzeit average-case Durchschnitt der Laufzeiten des Algorithmus über alle Eingaben 23
Beispiel: Durchsuchen einer Folge Spezifikation des Suchproblemes: V: Eingaben x = (x 1,..., x n ), y N: Ausgabe: Algorithmus : Suche 1 Eingabe : (x 1,..., x n ), y Ausgabe : gefunden gefunden Nein i 1 solange i n : wenn x i = y dann gefunden Ja i i + 1 Laufzeit (Tafel) Ja, falls ein i {1,..., n} mit x i = y existiert, sonst Nein 24
Mathematische Grundlagen: Wachstumsklassen präzise Laufzeitfunktion meist nicht relevant, nur die Größenordnung des Wachstums Ziel: Abschätzung der Größenordnung der Wachstumsfunktion durch Vergleich mit einfachen Funktionen Abschätzungen des asymptotischen Wachstums gelten nur für hinreichend große Werte 25
Wachstumsklassen Funktionenklassen zu einer gegebenen Funktion g : N R 0 O(g) = {f : N R 0 n 0 N c > 0 n n 0 : f (n) cg(n)} f wächst höchstens so schnell wie g (asymptotische obere Wachstumsschranke) o(g) = {f : N R 0 n 0 N c > 0 n n 0 : f (n) < cg(n)} f wächst langsamer als g Ω(g) = {f : N R 0 n 0 N c > 0 n n 0 : 0 cg(n) f (n)} f wächst mindestens so schnell wie g (asymptotische untere Wachstumsschranke) ω(g) = {f : N R 0 n 0 N c > 0 n n 0 : 0 cg(n) < f (n)} f wächst schneller als g Θ(g) = O(g) Ω(g) (asymptotisch gleiches Wachstum) Gilt genau dann, wenn f O(g) und g O(f ) 26
Asymptotische obere Schranke O(g) = {f : N R 0 n 0 N c > 0 n n 0 : f (n) cg(n)} Beispiele: 3/2n 2 + 3/2n + 2 O(n 2 ) n O(n 3 ) 2 n O(n 3 ) geeignete Abschätzung für worst-case-analyse 27
Vereinfachungen in O-Notation O(cf ) = O(f ), konstante Faktoren irrelevant O(f + g) = max(o(f ), O(g)), Summanden mit kleinerem Wachstum irrelevant, z.b. Polynome kleineren Grades O(log a n) = O(log b n) 28
Berechnung durch Grenzwerte 1000n 5 5463524n 4 + 13n 3 + n 2 O(n 5 ) wegen 1000n 5 5463524n 4 + 13n 3 + n 2 lim n n 5 1000n 5 = lim n n 5 = 1000 < Beispiele: O(n/2) = O(134n) = O(n + 5000) = O(n 5000) = O(17n 5000) = O(n/5000) = O(n) O(log n) O(n) O(n 2 ) O(2 n ) 29
Beispiele n + 1000 O(n) 1000n O(n) 1000n O(n 2 ) 1000n O( n) 1000n 5 + 3524n 2 O(n 5 ) 1000n 5 + 3524n 2 O(n 6 ) n/1000 + 3524 O(n) log a n O(log b n) 30
Wichtige Funktionenklassen O(1) konstantes Wachstum O(n) lineares Wachstum O(n 2 ) quadratisches Wachstum O(n 3 ) kubisches Wachstum O(n k ) polynomielles Wachstum O(log n) logarithmisches Wachstum O(n log n) O(log log n) doppelt logarithmisches Wachstum O(2 n ) exponentielles Wachstum 31
Laufzeitabschätzungen für Ablaufstrukturen elementare Operationen A (Zuweisung, Berechnung eines arithmetischen Ausdruckes, Vergleich) T (A) = 1 O(1) sequentielle Verknüpfung (Nacheinanderausführung) Algorithmus A = A_1; A_2 Laufzeit T (A) = T (A 1 ) + T (A 2 ) Verzweigung (Alternative) Algorithmus A = if C then A_1 else A_2 Laufzeit T (A) = max(t (A 1 ), T (A 2 )) O(T (A 1 ) + T (A 2 )) Wiederholung (Schleife) Algorithmus A = for i = 1 to n A_i Laufzeit T (A) = T (A 1 ) + T (A 2 ) +... + T (A n ) oft für jeden Durchlauf gleiche Laufzeit, dann T (A) = nt (A 1 ) 32
Beispiel: Suche 2 Spezifikation des Suchproblemes: V: Eingaben x = (x 1,..., x n ), y N: Ausgabe: Algorithmus : Suche 2 Eingabe : (x 1,..., x n ), y Ausgabe : gefunden Ja, falls ein i {1,..., n} mit x i = y existiert, sonst Nein gefunden Nein i 1 solange gefunden = Nein und i n : wenn x i = y dann gefunden Ja i i + 1 33
Laufzeiten Suche 1 best falls y = x 1 : T (n) O(n) worst falls y nicht in x vorkommt: T (n) O(n) average T (n) O(n) Suche 2 best falls y = x 1 : T (n) O(1) worst falls y nicht in x vorkommt: T (n) O(n) average T (n) O(n) 34
Beispiel Minimum-Suche Spezifikation: Eingabe x = (x 1,..., x n ) Ausgabe y mit 1. y {x 1,..., x n } und 2. z {x 1,..., x n } : y z Algorithmus : Minimum-Suche Eingabe : (x 1,..., x n ) Ausgabe : y y x 1 für jedes i 2,..., n : wenn y > x i dann y x i Laufzeit: O(n) 35
Beispiele Laufzeiten Für alle Algorithmen: Algorithmus : A Eingabe : n Ausgabe : s Algorithmus : B k 52; s 5 für jedes i 1,..., n : für jedes j 1,..., k : s n + ij k 52; s 5 für jedes i 1,..., n : für jedes j 1,..., n : s n + ij Algorithmus : C k 52; s 5 für jedes i 1,..., n : für jedes j 1,..., i : s i + j T (A) 0(n) T (B) 0(n 2 ) T (C) 0(n 2 ) 36
Rekursive Algorithmen Basisfall (Induktionsanfang): direkte Lösung Rekursionsschritt (Induktionsschritt): Funktionswert wird aus den Funktionswerten derselben Funktion mit anderen (einfacheren) Argumenten berechnet Beispiele: Fakultät { 1 falls n = 0 n! = n(n 1)! sonst Fibonacci-Funktion 0 falls n = 0 f (n) = 1 falls n = 1 f (n 1) + f (n 2) sonst Ackermann-Funktion y + 1 falls x = 0 a(x, y) = a(x 1, 1) falls y = 0 und x > 0 a(x 1, a(x, y 1)) sonst 37
Laufzeit-Berechnung für n! Spezifikation: V: x N N: y = x! Algorithmus : fac Eingabe : x Ausgabe : y wenn x = 0 dann y 1 sonst y x fac(x 1) Rekurrenz T (0) = 1 T (n) = T (n 1) + 1 T (n) = T (n 1) + 1 = (T (n 2) + 1) + 1 = T (n 2) + 2 = T (n 3) + 3... = T (n n) + n = T (0) + n = 1 + n Laufzeit O(n) 38
Divide-and-Conquer-Verfahren (teile und herrsche) Idee: rekursive Zerlegung des Problemes in Teilprobleme bis zum Basisfall Grundprinzip: Teilung des Problems P in n Teilprobleme P i Lösung aller Teilprobleme P i (Rekursion) Kombination der Lösungen der Teilprobleme P i zu einer Lösung des Problems P (Baumstruktur) 39
Beispiel: Suche in geordneten Folgen Spezifikation des Suchproblemes in geordneten Folgen: V: Eingaben totale Ordnung (M, ), x = (x 1,..., x n ) M aufsteigend geordneten (d.h. x 1 x 2 x n ) y M N: Ausgabe: Ja, falls ein i {1,..., n} mit x i = y existiert, sonst Nein 40
Algorithmus: Suche in geordneten Folgen Algorithmus : Suche3 Eingabe : (x 1,..., x n ), y und l, r {1,..., n} (Bereichsgrenzen) Ausgabe : gefunden wenn l > r dann gefunden Nein sonst m (l + r)/2 wenn x m = y dann gefunden Ja sonst wenn x m < y dann Suche3(x, y, m + 1, r) sonst Suche3(x, y, l, m 1) 41
Laufzeit: Suche in sortierten Folgen T (0) = T (1) = a T (n) = T ( n/2 ) + b mit Konstanten a, b für n = 2 k, also k = log n: T (n) = T (n/2 1 ) + b = T (n/2 2 ) + b + b = T (n/2 3 ) + 3b... = T (n/2 k ) + kb = T (n/n) + kb = a + kb = a + b log n Laufzeit: O(log n) 42
Häufig vorkommende Rekurrenzen T (n) = T (n 1) + 1... = T (0) + n O(n) T (n) = T (n 1) + n... = T (0) + n 2 O(n 2 ) T (n) = T (n/2) + 1... = T (0) + log n O(log n) T (n) = T (n/2) + n... = T (0) + n log n O(n log n) T (n) = 2T (n/2) + 1... = 2 log n T (0) + 2 log n log n O(n log n) T (n) = 2T (n 1) + 1 O(2 n ) Allgemeines Verfahren zum Lösen von Rekurrenzen: Master-Theorem 43
Klassisches Beispiel: Türme von Hanoi Positionen A, B.C n Scheiben {1,..., n} der Größen 1,..., n Bedingung: Scheibe i darf nur dann auf Scheibe j liegen, wenn i < j zulässige Bewegungen (zusammen ein Zug): Nimm die obere Scheibe i von Position x {A, B, C} und Lege diese Scheibe i auf Position y {A, B, C}, sofern damit auf Position y die Bedingung nicht verletzt wird Startsituation: Auf Position A ein Turm aus n (zulässig) gestapelten Scheiben, Positionen B, C leer Zielsituation: Auf Position B ein Turm aus n (zulässig) gestapelten Scheiben, Positionen A, C leer gesucht: Folge von Schritten vom Start- zum Zielzustand 44
Türme von Hanoi: rekursiver Algorithmus Verschiebe einen Hanoi-Turm der Höhe n von Position A zu Position B, falls nötig, unter Verwendung der Position C: Spezifikation: V: (x : n, y : 0, z : 0), l = () N: (x : 0, y : n, z : 0), l enthält die Folge aller Züge (Start- und Zielposition der bewegten Scheibe) Algorithmus Hanoi(x, y, z): Basisfall: n = 0 (keine Bewegung) Rekursionsschritt: 1. die oberen n 1 Scheiben von Position x zu Position z verschieben, falls nötig, unter Verwendung der Position y (rekursiv), 2. Verschiebe die größte Scheibe von Position x zu Position y, Zug (x y) an l anhängen 3. die n 1 Scheiben von Position z zu Position y verschieben, falls nötig, unter Verwendung der Position x (rekursiv). 45