11. Rekursion, Komplexität von Algorithmen

Ähnliche Dokumente
11. Rekursion, Komplexität von Algorithmen

11. Rekursion. - Wiederholung von Anweisungen: durch Iteration und Rekursion - Anwendungsfälle der Rekursion

Komplexität von Algorithmen

Vorkurs Informatik WiSe 17/18

Komplexität von Algorithmen

II.3.1 Rekursive Algorithmen - 1 -

Abschnitt 7: Komplexität von imperativen Programmen

FHZ. K13 Rekursion. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Vorkurs Informatik WiSe 16/17

11. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Mathematische Rekursion. Rekursion in Java: Genauso! Unendliche Rekursion. n!

12. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Lernziele. Mathematische Rekursion. Rekursion in Java: Genauso! n! =

12. Such- und Sortierverfahren mit Arrays

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

5. Algorithmen. K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

6. Iteration (Schleifenanweisungen)

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)

Rekursion. Sie wissen wie man Programme rekursiv entwickelt. Sie kennen typische Beispiele von rekursiven Algorithmen

Aufrufe von Objektmethoden

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

C++ - Kontrollstrukturen Teil 2

6. Iteration (Schleifenanweisungen)

( )= c+t(n-1) n>1. Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)

Beim rekursiven Aufruf einer Funktion wird jeweils ein Duplikat der gesamten Funktion im Speicher abgelegt.

Kasparov versus Deep Blue. Till Tantau. Institut für Theoretische Informatik Universität zu Lübeck

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Datenstrukturen und Algorithmen

Programmieren 1 C Überblick

Komplexität von Algorithmen:

Objektorientierte Programmierung VL: Prof. Dr. Marco Block-Berlitz - Freie Universität Berlin Proinformatik III

Prof. Dr. Margarita Esponda

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

Erste Java-Programme (Scopes und Rekursion)

Grundlagen der Informatik Algorithmen und Komplexität

Rekursive Funktionen

Klassenvariablen, Klassenmethoden

Hallo Welt für Fortgeschrittene

Speicher und Adressraum

Ziele. Kapitel 10: Komplexität von Algorithmen und Sortierverfahren. Beispiel: Lineare Suche eines Elements in einem Array (1)

Elementare Konzepte von

Rekursive Funktionen

Schnittstellen, Stack und Queue

2. Algorithmenbegriff

JAVA - Rekursion

II.1.1. Erste Schritte - 1 -

Prof. Dr. Margarita Esponda

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Grundlagen der Programmierung

Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren

Inhalt. 7 Rekursionen Eine unendliche Geschichte Fakultät Türme von Hanoi Dr.

Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren

Einstieg in die Informatik mit Java

2.2 Syntax, Semantik und Simulation

EINI WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Lösungsvorschlag Serie 2 Rekursion

II.1.1. Erste Schritte - 1 -

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 -

15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Programmieren und Problemlösen

Algorithmik Übung 2 Prof. Dr. Heiner Klocke Winter 11/

Einleitung Grundlagen Erweiterte Grundlagen Zusammenfassung Literatur. C: Funktionen. Philip Gawehn

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

10. Felder (Arrays) Teil 2. Java-Beispiele: Echo.java Primzahlen.java Monate.java. K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

Software Entwicklung 1

Algorithmen und Datenstrukturen Tafelübung 4. Jens Wetzl 15. November 2011

Abschnitt 11: Korrektheit von imperativen Programmen

12. Rekursion Grundlagen der Programmierung 1 (Java)

(08 - Einfache Sortierverfahren)

Kapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Java I Vorlesung Imperatives Programmieren

Einführung in die Programmierung Wintersemester 2016/17

Transkript:

11. Rekursion, Komplexität von Algorithmen Teil 2 Java-Beispiele: Power1.java Hanoi.java K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 Version: 23. Nov. 2015

Anwendung der Rekursion Rekursiv definierte Funktionen - Fibonacci-Funktion - Fakultät, Potenz -... Rekursiver Aufbau der zu verarbeitenden Daten - Programme (EBNF)-> Compiler - Bäume und Listen (Teil III) Natürliche rekursive Problemlösungen - Sortierverfahren - Türme von Hanoi -... K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 2

3 Rekursiver Aufbau von Daten: Syntax von Programmiersprachen

4 Programmstruktur: rekursiv definiert Anweisung if ( x > 1 ) Anweisung Anweisung Anweisung x = y ; else { y = z ; z = 1 ; }

5 Beispiel: rekursiver Aufbau der Daten Compiler: Parser (Syntaxanalyse) Eingabedaten für Compiler/Parser? EBNF: Anweisung ::= Auswahlanweisung Block... Auswahlanweisung ::= if ( Ausdruck ) Anweisung [ else Anweisung ] Block ::= { Anweisung... } Parser: 1. testet, ob Anweisung vorliegt 2. findet if-anweisung 3. testet im Innern der if-anweisung: liegen 1 (2) innere Anweisungen vor rekursiver Aufruf des Tests, ob Anweisung anliegt

6 Parser : testet in jedem Zustand, ob bestimmte Syntaxeinheit anliegt 1. Ebene if ( x > 1 ) x = y ; else { y = z ; z = 1 ; } 2. Ebene Algorithmus: Test auf Anweisung Block / Verbundanweisung 3. Ebene Compiler muss rekursiv arbeiten 1. Ebene: Einstieg in den Algorithmus 2. Ebene: 1. rekursiver Aufruf (zwei mal) 3. Ebene: 2. rekursiver Aufruf (in Block, zwei mal) Einzelheiten: Compilerbau

Anwendung der Rekursion Rekursiv definierte Funktionen - Fibonacci-Funktion - Fakultät, Potenz -... Rekursiver Aufbau der zu verarbeitenden Daten - Programme (EBNF)-> Compiler - Bäume und Listen (Teil III) Natürliche rekursive Problemlösungen - Sortierverfahren (II.12) - Türme von Hanoi -... K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 7

8 Rekursive Problemlösungen: Türme von Hanoi

Rekursive Problemlösungen: Türme von Hanoi Aufgabe: Scheiben liegen der Größe nach geordnet auf einem Platz A und sollen auf einen Platz C unter Zuhilfenahme eines Platzes B transportiert werden. Randbedingungen: - immer nur eine Scheibe bewegen (die obere) - niemals größere über einer kleineren Scheibe A (Start) B (Hilfe) C (Ziel) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 9

Aufgabe (Fortsetzung) Gesucht: Folge von Einzelbewegungen, die zum Ziel führen % java Hanoi Anzahl der Scheiben: 5 Scheibenbewegungen: von A nach C von A nach B von C nach B von A nach C... A (Start) B (Hilfe) C (Ziel) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 10

Lösungsalgorithmus: iterativ oder rekursiv? Gesucht: Folge von Einzelbewegungen, die zum Ziel führen. d. h. Algorithmus muss für wiederholte Berechnung von Einzelschritten sorgen. Iterativer Algorithmus? Möglich - aber: nicht naheliegend Solange (noch nicht am Ziel) Berechne nächste Bewegung Rekursiver Algorithmus? Natürliche Lösung des Problems: Zerlegung des Problems in einfachere Teilprobleme, die rekursiv bearbeitet werden bewege n Scheiben bewege n-1 Scheiben K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 11

12 Rekursiver Lösungsalgorithmus 0 1 A (Start) B (Hilfe) C (Ziel) A (Start) B (Hilfe) C (Ziel) 2 A (Start) B (Hilfe) C (Ziel) 3 A (Start) B (Hilfe) C (Ziel)

13 Rekursiver Lösungsalgorithmus 0 1 A (Start) B (Hilfe) Problem: C (Ziel) Bewege n Scheiben zurückgeführt auf 3 Teilprobleme: Bewege n-1 Scheiben A (Start) B (Hilfe) C (Ziel) 2 Bewege 1 Scheibe 3 A (Start) B (Hilfe) C (Ziel) Bewege n-1 Scheiben A (Start) B (Hilfe) C (Ziel)

14 Rekursiver Lösungsalgorithmus Bewege n Scheiben von start über hilfe nach ziel Anfang: n = 1 (e i n e Scheibe) Transportiere die Scheibe direkt von start nach ziel Schritt: n > 1 1. Bewege n - 1 Scheiben *) von start über ziel nach hilfe 2. Transportiere eine (größte) Scheibe direkt von start nach ziel 3. Bewege n - 1 Scheiben *) von hilfe über start nach ziel *) Bewege : Kein gleichzeitiger Transport von n -1 > 1 Scheiben! Sondern: Anwendung des Algorithmus auf weniger als n Scheiben (Rekursivität)

15 Hanoi-Programm: rekursiver Algorithmus static void bewege (int n, char start, char hilfe, char ziel) { } if (n == 1) System.out.println(" von " + start + " nach " + ziel); else { bewege(n - 1, start, ziel, hilfe); System.out.println(" von " + start + " nach " + ziel); bewege(n - 1, hilfe, start, ziel); } Gesamtproblem 3 Teilprobleme (mit 2 rekursiven Aufrufen)

16 Hanoi-Programm: Rahmen public static void main (String argv[]) { int n; } System.out.print("Anzahl der Scheiben: "); n = Keyboard.readInt(); if (n > 0) {... bewege(n, A, B, C ); } else System.out.println("Zahl nicht positiv"); Plätze durch Zeichen bezeichnet

Hanoi-Programm: Rahmen public static void main (String argv[]) { int n; System.out.print("Anzahl der Scheiben: "); n = Keyboard.readInt(); if (n > 0) {... bewege(n, A, B, C ); } else System.out.println("Zahl nicht positiv"); } % java Hanoi % java Hanoi Anzahl der Scheiben: 5 Anzahl der Scheiben: 10 Scheibenbewegungen: Scheibenbewegungen: von A nach C von A nach C von A nach B 1023 Bewegungen. %. java Hanoi von C nach B Anzahl der Scheiben: 100 von A nach C ca. 10 Mrd.... Scheibenbewegungen:... K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 17

18 Hanoi-Programm: Visualisierung http://www.mathematik.ch/spiele/hanoi_mit_grafik/

19 Aufrufbeziehungen: Hanoi Abk.: bewege(5, A, B, C ) = b(5, A, B, C ) b(5, A, B, C ) b(4, A, C, B ) b(4, B, A, C ) b(3, A, B, C ) b(3, C, A, B )...... b(2,...) b(2,...)...... b(1,...) b(1,...)......

Überführung: Rekursion Iteration Warum? Rekursion: zeit- und speicheraufwendig (Aufrufe von Methoden) Es gibt Programmiersprachen ohne Rekursion K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 20

21 Hanoi: rekursiv iterativ (mit Abspeicherung von zu lösenden Problemen: Stack) Grundprinzip: In einem (Zyklus-)Schritt: Löse immer das aktuelle Problem und merke die später zu lösenden Probleme in einem Problemspeicher (Stack) Ein Problem: Bewege n Scheiben von 'start' über 'hilfe' nach 'ziel' Im Problemspeicher (Stack / Stapel): das aktuelle Problem ist 'oben' gespeichert, die anderen Probleme liegen darunter Algorithmus: Wie? Solange noch Probleme zu lösen sind while (!isempty(problemstack)) { // bearbeite das aktuelle (oberste) Problem } n = 1 drucken und Problem streichen n > 1 Problem streichen + speichere drei neue Probleme

Beispiel: 'Problem-Stack' bewege (5, 'A', 'B', 'C'); Stackentwicklung (Speicher aller zu lösenden Probleme): Anfang: 5 A B C aktuelles Problem aktuelles Problem 1. Zyklusschritt: 4 A C B 1 A B C 4 B A C alle zu lösenden Probleme while (!isempty(problemstack)) { // bearbeite das aktuelle (oberste) Problem } n = 1 drucken und Problem streichen K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 n > 1 Problem streichen + speichere drei neue Probleme 22

23 Beispiel: 'Problem-Stack' bewege (5, 'A', 'B', 'C'); Anfang: 1. Zyklusschritt: 2. Zyklusschritt: Stackentwicklung: 5 A B C 4 A C B 1 A B C 4 B A C 3 A B C 1 A C B 3 C A B 1 A B C 4 B A C Weitere Zyklusschritte? 3. Zyklusschritt: 4. Zyklusschritt: 2 A C B 1 A B C 2 B A C 1 A C B 3 C A B 1 A B C 4 B A C 1 A B C 1 A C B 1 C A B 1 A B C 2 B A C 1 A C B 3 C A B 1 A B C 4 B A C

Beispiel: 'Problem-Stack' bewege (5, 'A', 'B', 'C'); Anfang: 1. Zyklusschritt: 2. Zyklusschritt: Stackentwicklung: 5 A B C 4 A C B 1 A B C 4 B A C 3 A B C 1 A C B 3 C A B 1 A B C 4 B A C 5. 6. 7. 8. Zyklusschritt: 4 * drucken und 4 Probleme streichen: K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 3. Zyklusschritt: 4. Zyklusschritt: 2 A C B 1 A B C 2 B A C 1 A C B 3 C A B 1 A B C 4 B A C 1 A B C 1 A C B 1 C A B 1 A B C 2 B A C 1 A C B 3 C A B 1 A B C 4 B A C 24

Modifizierte Aufgabe: Modifiziertes Problem: Türme von Hanoi Scheiben liegen der Größe nach geordnet auf einem Platz A und sollen auf einen Platz C unter Zuhilfenahme eines Platzes B transportiert werden. Randbedingungen: Idee? - immer nur eine Scheibe bewegen (die obere) - niemals größere über einer kleineren Scheibe - Transport nur zwischen Nachbarplätzen, d.h. verboten A C, C A Anzahl der Scheibenbewegungen? A (Start) B (Hilfe) C (Ziel) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 25

26 Wertung: Rekursion Alternative iterative Lösung immer möglich - weil alles in Maschinensprache ablaufen muss ohne Rekursion - Idee für iterative Lösung: natürliche rekursive Lösung Iterative Variante: oft schneller (Methodenaufrufe: zeitintensiv) Rekursive Lösung: oft lesbarer, eleganter aber zeit- und speicheraufwendig Rekursion: nicht um jeden Preis Nur wenn Lesbarkeit erhöht, anwenden auf : rekursive Funktionen rekursive Daten rekursive Problemlösungen Rekursive Lösung dort meist die einzige sinnvolle!

27 Komplexität von Algorithmen: Rechenaufwand Nicht: Komplexität von Programmen Unterschied? Programm: Größe/Länge des Programms Algorithmus: Laufzeit/Berechnungsaufwand

Komplexitätsbetrachtungen von Algorithmen Warum? Oft wichtig: - Vor Entwicklung von Programmen: Lohnt sich die Entwicklung eines Programms überhaupt: rechnet 100000 Jahre - Vor Nutzung von Programmen: Welche Eingaben verkraftet das Programm bzgl. der Laufzeit? K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 28

Beispiel: Welche Eingaben verkraftet das Hanoi-Programm? % java Hanoi Anzahl der Scheiben: 1000 Scheibenbewegungen: von A nach C... Wie viele Ausgaben (welche Zeit)? Scheiben 1 5 30 1000 Bewegungen 1 31 ~ 1 Mrd. ~10 100 Zahl mit 100 Nullen K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 29

30 Dauer aller Scheibenbewegungen Bei einer Scheibe pro Sekunde Anzahl Scheiben Benötigte Zeit 5 31 Sekunden 10 17,1 Minuten 20 12 Tage 30 34 Jahre 40 348 Jahrhunderte 60 36,6 Milliarden Jahre 64 585 Milliarden Jahre Falls schneller Rechner: 1 Mia Bewegungen pro Sekunde 585 Jahre für 64 Scheiben! 1000 Scheiben?

31 Komplexitätsbetrachtungen: H a n o i n 1 2 6 10 1000 Anzahl Bewegungen Beweis: Vollständige Induktion 1 3 63 1023 ~10 100 Allgemein: anz(n) = 2 n - 1 Anfang: anz(1) = 2-1 = 1 (gilt nach dem Algorithmus) Schritt: anz(n+1) = 2 (n+1) - 1 = 2 * 2 n - 1 = 2 * (2 n -1) + 1 = 2 * anz(n) + 1 (nach Vor.) Damit gilt: für (n+1) wird die bisher ermittelte Anzahl für n verdoppelt + 1 Gilt nach: Hanoi-Algorithmus -> siehe Beschreibung des Algorithmus

32 Komplexitätsbetrachtungen: H a n o i n 1 2 6 10 1000 Anzahl Bewegungen Beweis: Vollständige Induktion 1 3 63 1023 ~10 100 Anfang: anz(1) = 2-1 = 1 (gilt nach dem Algorithmus) Schritt: anz(n+1) = 2 (n+1) - 1 = 2 * 2 n - 1 = 2 * (2 n -1) + 1 Allgemein: anz(n) = 2 n - 1 = 2 * anz(n) + 1 (nach Vor.) bewege(n - 1, start, ziel, hilfe); Transportiere eine Scheibe(start " nach ziel); bewege(n - 1, hilfe, start, ziel); Damit gilt: für (n+1) wird die bisher ermittelte Anzahl für n verdoppelt + 1 Gilt nach: Hanoi-Algorithmus -> siehe Beschreibung des Algorithmus

Teilgebiete der Informatik und ihre Beziehungen Komplexitätstheorie: Theorie des Berechnungsaufwands von Algorithmen Praktische Informatik: - Datenbanken - Software Engineering - Programmiersprachen - Compilerbau - Betriebssysteme - Systemanalyse Theoretische Informatik: (Teilbereiche:) - Algorithmentheorie - Berechnungstheorie - Codierungstheorie - formale Sprachen - Automatentheorie - Komplexitätstheorie - Logik Technische Informatik: Angewandte Informatik: K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 33

Komplexität von Algorithmen Zusammenhang zwischen Größe der Eingabe n Berechnungsaufwand O(n) Beispiele: Exponent n bei power n n n log 2 n (power) (power1) Multiplikationen Anzahl n der Scheiben bei Hanoi n 2 n -1 Ausgabeoperationen (Scheibenbewegungen) Anzahl n der Elemente beim Sortieren K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 Anzahl: Vergleiche, Vertauschungen 34

Komplexitätsklassen von Algorithmen Algorithmen heißen..., falls der Zusammenhang zwischen n und dem Berechnungsaufwand O in dem angegebenen Verhältnis steht. konstant: logarithmisch: (power1) linear: (power) n log 2 n: O(n) = Konstante k O(n) = k * log 2 n O(n) = k * n O(n) = k * n log 2 n quadratisch: O(n) = k * n 2 polynomiell: O(n) = k * n m (m>1) exponentiell: (Hanoi) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 O(n) = k * 2 n genauer Wert bei Hanoi: 2 n -1 kleinere Dimension bei O(n) weggelassen es kommt auf Größenordnung an 35

36 Komplexitätsklassen: Zusammenhänge Größe der Eingabe: Berechnungsaufwand: Anzahl der Operationen (z.b. Multiplikationen, Scheibenbewegungen) n O (n) k k log 2 n k * n k * 2 n? power1 power Hanoi

Komplexitätsklassen: ausgewählte Werte n 2 8 10 100 1000 konstant 1 1 1 1 1 logarithmisch (power1) linear (power) 1 3 4 7 10 2 8 10 100 1000 quadratisch 4 64 100 10.000 1.000.000 exponentiell (Hanoi) 4 256 1024 ~10 Mrd. ~10 100 (Größere Dimension entscheidet, kleinere Dimension weggelassen) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16 37

38 Komplexitätsbetrachtungen Programmierung: Suche nach effizienten Algorithmen nicht jeder Algorithmus ist geeignet Lohnt sich die Entwicklung eines Programms überhaupt (rechnet 100000 Jahre)? Welche Eingaben verkraftet das Programm bzgl. der Laufzeit (vgl. Hanoi-Programm)?