Komplexität von Algorithmen

Ähnliche Dokumente
Abschnitt 7: Komplexität von imperativen Programmen

Überblick. Notwendigkeit der Rekursion (1)

Programmieren und Problemlösen

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

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

Kapitel 1: Algorithmen und ihre Analyse

Komplexität von Algorithmen:

Prof. Dr. Margarita Esponda

Prof. Dr. Margarita Esponda

Komplexität von Algorithmen

Stabilitätsabschätzungen Vorlesung vom

2. Hausübung Algorithmen und Datenstrukturen

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Rekursion

Übung zur Vorlesung Berechenbarkeit und Komplexität

11. Rekursion, Komplexität von Algorithmen

Algorithmen und Datenstrukturen (für ET/IT)

Lösungsvorschlag Serie 2 Rekursion

Komplexität. G. Zachmann Clausthal University, Germany Leistungsverhalten von Algorithmen

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Asymptotik und Laufzeitanalyse

Informatik I Komplexität von Algorithmen

2. Effizienz von Algorithmen

Kostenmodell. Daniel Graf, Tobias Pröger. 22. September 2016 (aktualisierte Fassung 5 vom 9. Oktober 2016)

Bemerkung: der goldene Schnitt ϕ ist die positive Lösung der Gleichung: x 2 = 1 + x

Informatik I Komplexität von Algorithmen

Algorithmen und Datenstrukturen

3.3 Laufzeit von Programmen

Grundlagen der Informatik Algorithmen und Komplexität

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

Numerische Verfahren und Grundlagen der Analysis

Form der Äquivalenzklassen

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

Informatik I: Einführung in die Programmierung

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Komplexität von Algorithmen OOPM, Ralf Lämmel

AlgoDat Fragen zu Vorlesung und Klausur

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Einstieg in die Informatik mit Java

3.2. Korrektheit und Komplexität am Beispiel: Sortieren Sortieren ist eine wichtige Basis-Operation für komplexe Algorithmen

Einführung in die Informatik I

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

2 Wachstumsverhalten von Funktionen

Folgen und Funktionen in der Mathematik

1. Asymptotische Notationen 2. Zahlentheoretische Algorithmen 3. Sortierverfahren 4. String Matching 5. Ausgewählte Datenstrukturen

4 Effizienz und Komplexität 3.1 1

Kapitel 2. Elementare Zahlentheorie Primfaktorzerlegung

Algorithmen und Datenstrukturen

Informatik II. Vorlesung am D-BAUG der ETH Zürich. Felix Friedrich & Hermann Lehner FS 2018

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

2. Algorithmen und Algorithmisierung Algorithmen und Algorithmisierung von Aufgaben

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

Exponentiation: das Problem Gegeben: (multiplikative) Halbgruppe (H, ), Element a H, n N Aufgabe: berechne das Element

Einführung in die Informatik I

Komplexität von Algorithmen

Exponentiation: das Problem

Grundlagen: Algorithmen und Datenstrukturen

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

Algorithmen und Datenstrukturen Effizienz und Funktionenklassen

Das O-Tutorial. 1 Definition von O, Ω, Θ, o und ω

Kapitel III Ringe und Körper

2: Restklassen 2.1: Modulare Arithmetik

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Volker Kaatz. Faktorisierung. Faktorisierung. Problem und Algorithmen. Relevanz in der Kryptographie

11. Rekursion, Komplexität von Algorithmen

Kapitel 3 Zur Korrektheit und Effizienz von Algorithmen

Übung Algorithmen und Datenstrukturen

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

2. Grundlagen. Beschreibung von Algorithmen durch Pseudocode. Korrektheit von Algorithmen durch Invarianten.

Übersicht Datenstrukturen und Algorithmen. Literatur. Algorithmus: Wikipedia Definition. Vorlesung 1: Einführung. Prof. Dr.

Hallo Welt für Fortgeschrittene

Algorithmen und Datenstrukturen 1. EINLEITUNG. Algorithmen und Datenstrukturen - Ma5hias Thimm 1

Algorithmen und Datenstrukturen 04

3.2. Divide-and-Conquer-Methoden

Software Entwicklung 1

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

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Algorithmus. Wie beschreibt man Algorithmen?

ggt mit Euklid Satz: Um ggt(k, l) mit dem Euklidischen Algorithmus zu berechnen, braucht man höchstens log Φ k < 3 2 log 2 k rekursive Aufrufe.

Algorithmen und Datenstrukturen (für ET/IT)

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 5. Asymptotische Laufzeitkomplexität Definition Regeln Beispiele

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Transkript:

Komplexität von Algorithmen Prof. Dr. Christian Böhm WS 07/08 in Zusammenarbeit mit Gefei Zhang http://www.dbs.informatik.uni-muenchen.de/lehre/nfinfosw

Ressourcenbedarf - Größenordnungen Prozesse verbrauchen u.a. zwei Ressourcen: Rechenzeit Speicherplatz Die folgenden Größenordnungen geben an, wie viel Rechenzeit oder Speicherplatz verbraucht werden. 2

Laufzeitanalyse (1) 1. Ansatz: Direktes Messen der Laufzeit (z.b. in ms): Abhängig von vielen Parametern, wie Rechnerkonfiguration, Rechnerlast, Compiler, Betriebssystem, Deshalb: kaum übertragbar und ungenau 2. Ansatz: Zählen der benötigten Elementaroperationen des Algorithmus in Abhängigkeit von der Größe n der Eingabe Das algorithmische Verhalten wird als Funktion der benötigten Elementaroperationen dargestellt. Die Charakterisierung dieser elementaren Operationen ist abhängig von der jeweiligen Problemstellung und dem zugrunde liegenden Algorithmus. Beispiele für Elementaroperationen: Zuweisungen, Vergleiche, arithmetische Operationen, Zeigerdereferenzierungen oder Arrayzugriffe 3

Laufzeitanalyse (2) Das Maß für die Größe n der Eingabe ist abhängig von der Problemstellung, z.b. Suche eines Elementes in einer Liste: n = Anzahl der Elemente Multiplikation zweier Matrizen: n = Dimension der Matrizen Sortierung einer Liste von Zahlen: n = Anzahl der Zahlen Berechnung der k-ten Fibonacci-Zahl: n = k Laufzeit = benötigte Elementaroperationen bei einer bestimmten Eingabelänge n Analog: Speicherplatz = benötigter Speicher bei einer bestimmten Eingabelänge n 4

Problem: Hardware-Abhängigkeit Laufzeit einzelner Elementar-Operation ist abhängig von der eingesetzten Rechner-Hardware. Frühere Rechner (incl. heutige PDAs, Mobiltelefone ): billig : Fallunterscheidungen, Wiederholungen mittel : Rechnen mit ganzen Zahlen (Multiplikation usw.) teuer : Rechnen mit reellen Zahlen Heutige Rechner (incl. z.b. Spiele-Konsolen): billig : Rechnen mit reellen und ganzen Zahlen teuer : Fallunterscheidungen 5

Asymptotisches Laufzeitverhalten Kleine Probleme (z.b. n=5) sind uninteressant: Die Laufzeit des Programms ist eher bestimmt durch die Initialisierungskosten (Betriebssystem, Programmiersprache etc.) als durch den Algorithmus selbst. Interessanter: Wie verhält sich der Algorithmen bei sehr großen Problemgrößen? Wie verändert sich die Laufzeit, wenn ich die Problemgröße variiere (z.b. Verdopplung der Problemgröße) asymptotisches Laufzeitverhalten 6

Definition O-Notation Mit der O-Notation haben Informatiker einen Weg gefunden, die asymptotische Komplexität (bzgl. Laufzeit oder Speicherplatzbedarf) eines Algorithmus zu charakterisieren. Definition O-Notation: Seien f : N N und s : N N zwei Funktionen (s wie Schranke). Die Funktion f ist von der Größenordnung O(s), geschrieben f O(s), wenn es k N und m N gibt, so dass gilt: Für alle n N mit n m ist f (n) k * s(n). 7

Bemerkungen zur O-Notation k ist unabhängig von n: k muss dieselbe Konstante sein, die für alle n N garantiert, dass f (n) k * s(n). Existiert KEINE solche Konstante k, ist f nicht von der Größenordnung O(s). O(s) bezeichnet die Menge aller Funktionen, die bezüglich s die Eigenschaft aus der Definition haben. Man findet in der Literatur häufig f = O(s) statt f O(s). Da f nicht gleichzeitig Element von O(s) und gleich zu O(s) sein kann, ist das irreführend. 8

Rechnen mit der O-Notation Elimination von Konstanten: 2 n O(n) n/2 +1 O(n) Bei einer Summe zählt nur der am stärksten wachsende Summand (mit dem höchsten Exponenten): 2n 3 + 5n 2 + 10n + 20 O(n 3 ) O(1) O(log n) O(n) O(n log n) O(n 2 ) O(n 3 ) O(2 n ) Beachte: 1000 n 2 ist nach diesem Leistungsmaß immer besser als 0,001 n 3, auch wenn das m, ab dem die O(n 2 )-Funktion unter der O(n 3 )-Funktion verläuft, sehr groß ist (m=1 Million) 9

Wichtige Klassen von Funktionen (1) O(1) O(log n) O(n) O(n log n) O(n log² n) O(n²) O(n k ), k 2 O(2 n ) Sprechweise konstant logarithmisch linear quadratisch polynomiell exponentiell Typische Algorithmen / Operationen Addition, Vergleichsoperationen, rekursiver Aufruf, Suchen auf einer sortierten Menge Bearbeiten jedes Elementes einer Menge gute Sortierverfahren primitive Sortierverfahren Ausprobieren von Kombinationen 10

Wichtige Klassen von Funktionen (2) Die O-Notation hilft insbesondere bei der Beurteilung, ob ein Algorithmus für großes n noch geeignet ist bzw. erlaubt einen Effizienz- Vergleich zwischen verschiedenen Algorithmen für große n. Schlechtere als polynomielle Laufzeit gilt als nicht effizient. 11

Beispiel: Laufzeitanalyse Fakultätsfunktion public static void fak(int n) { int result = 1 ; for (int i=1 ; i<=n ; i++) result *= i ; return result ; } Für die Laufzeit T fak von fak gilt: T fak (n) O(n) Begründung: Die Schleife wird n mal ausgeführt. 12

Größter gemeinsamer Teiler Der größte gemeinsame Teiler (ggt) zweier natürlicher Zahlen a und b ist die größte natürliche Zahl, durch die sowohl a als auch b teilbar (d.h. ohne Rest dividierbar) ist. Die Notation t a wird verwendet, um auszudrücken, dass t ein Teiler von a ist (d.h. es gibt ein k N mit a = t * k). Ist t gemeinsamer Teiler von a und b, schreibe t a und t b. 13

Primfaktorzerlegung Der ggt von zwei natürlichen Zahlen a und b kann leicht aus der Primfaktorzerlegung von a und b ermittelt werden. Er ist das Produkt aller p n mit: die Primzahl p kommt in jeder der beiden Zerlegungen (einmal) vor, einmal mit Exponent n 1, einmal mit Exponent n 2. n ist das Minimum von n 1 und n 2. Die Zerlegung einer natürlicher Zahl in Primfaktoren ist eine zeitaufwendige Aufgabe, so dass dieser Ansatz zur Berechnung des ggt zweier natürlicher Zahlen ziemlich ineffizient ist. 14

Effizienter Ansatz zur Berechnung des ggt zweier natürlicher Zahlen Satz: Seien a N und b N mit a b. Sei r der Rest der Ganzzahldivision von a durch b (d.h. a = (b * c) + r für ein c N). Sei t N. t a und t b genau dann, wenn t b und t r. Daraus folgt, dass der ggt(a, b) zweier natürlicher Zahlen a und b mit a b und a = b * c + r gleich dem ggt(b, r) von b und r ist. 15

Beweis: Notwendige Bedingung (von links nach rechts => ) Seien a, b, c und r wie im Satz definiert. Sei angenommen, dass t a und t b. Zu zeigen ist, dass t b und t r gelten. Da nach Annahme t b gilt, reicht es, t r zu zeigen. Da t b gilt, gibt es t b mit b = t * t b. Da t a gilt, gibt es t a mit a = t * t a. Nach Annahme gilt a = b * c + r also t * t a = a = b * c + r = t * t b * c + r, also r = t * t a t* t b * c = t * (t a t b * c ), d.h. t r 16

Beweis: Hinreichende Bedingung (von rechts nach links <= ) Seien a, b, c und r wie im Satz definiert. Sei angenommen, dass t b und t r. Zu zeigen ist, dass t a und t b gelten. Da nach Annahme t b gilt, reicht es, t a zu zeigen. Da t b gilt, gibt es t b mit b = t * t b. Da t r gilt, gibt es t r mit r = t * t r. Nach Annahme gilt a = b * c + r also a = t * t b * c + t * t r = t * (t b * c + t r ), d.h. t a qed. 17

Endrekursive Funktion zur Berechnung des ggt public static int gcd(int a, int b) { int h; if (a<b) {h=a ; a=b ; b=h} while (b!= 0) { System.out.println ("a=" + a + " b=" + b) ; h = a%b ; a = b ; b = h ; } return a; } Der Algorithmus, den die Funktion ggt implementiert, konvergiert sehr schnell: ggt(150, 60): a=150 b=60 a=60 b=30 18

Euklid Dieser Algorithmus zur Berechnung des ggt zweier natürlicher Zahlen wird Euklid (ca. 3. Jh. vor Christus) zugeschrieben, weil er in Euklids Elemente der Mathematik erwähnt ist. Er gilt als der älteste bekannte Algorithmus, weil er im Gegensatz zu anderen überlieferten Algorithmen aus älteren oder sogar jüngeren Zeiten nicht mittels Beispielen, sondern abstrakt (mit Redewendungen anstelle von Variablen) spezifiziert ist. 19

Abschätzung der Rechenzeit des Euklid schen Algorithmus Satz (Lamé) Seien a N und b N, so dass a b ist. Benötigt der Euklid sche Algorithmus zur Berechnung von ggt(a, b) insgesamt n Iterationen, so gilt b fib(n), wobei fib(n) die n-te Fibonacci-Zahl ist. fib(0) = 0 ; fib(1) = 1 ; fib(n)=fib(n-1)+fib(n-2) ; Zahlenfolge: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1.597, 2.584, 4.181, 6.765, 20

Beweis des Satzes (1) Wir versuchen, die Ausgabe von unten nach oben zu konstruieren, so dass das minimal mögliche b und das minimal mögliche a entsteht: a=8 b=5 (n=5) a=5 b=3 (n=4) a=3 b=2 (n=3) a=2 b=1 (n=2) a=1 b=1 (n=1) (a=1 b=0) (n=0) Was ist das kleinste mögliche a n in Zeile Nummer n, das bei Division durch b n in Zeile n den Rest b n-1 in Zeile (n-1) ergibt? a n = b n + b n-1 b n+1 = b n + b n-1 21

Beweis des Satzes (2) Dieses Ergebnis entspricht dem Bildungsgesetz für die Fibonacci- Zahlen. Deshalb kann man die Hypothese aufstellen, dass b 0 fib(n), wenn n die Anzahl der Schleifeniterationen der Funktion ggt während der Berechnung von(a 0, b 0 ) ist (wobei dieser allererste Aufruf nicht mitgezählt wird). 22

Bezug zum Goldenen Schnitt Benötigt der Euklid sche Algorithmus zur Berechnung von ggt(a,b) genau n rekursive Aufrufe, so gilt nach dem Satz von Lamé: b fib(n) Φ n (Φ = 1,618 ist der Goldene Schnitt) Daraus folgt, dass asymptotisch, also für große n, gilt (mit der Schreibweise log Φ für den Logarithmus zur Basis Φ): log Φ b n Da es aber eine Konstante k gibt mit log Φ b k *ln b, wobei ln den Logarithmus zur Basis e bezeichnet, gilt asymptotisch auch n k *ln b, also ggt(a,b) O(ln(b)) 23