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

Ähnliche Dokumente
Programmieren und Problemlösen

2. Effizienz von Algorithmen

Algorithmen und Datenstrukturen Effizienz und Funktionenklassen

V. Claus, Juli 2005 Einführung in die Informatik II 45

WS 2009/10. Diskrete Strukturen

Algorithmen und Datenstrukturen 1 Kapitel 5

Informatik I Komplexität von Algorithmen

Abschnitt 7: Komplexität von imperativen Programmen

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2012 / 2013 Vorlesung 3, Donnerstag 7.

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

Konstruktion der reellen Zahlen

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

Übersicht. Datenstrukturen und Algorithmen. Laufzeit von Algorithmen. Übersicht. Vorlesung 2: Asymptotische Effizienz (K3) Begründung Grenzwerte

Übung Algorithmen und Datenstrukturen

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

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / 2015 Vorlesung 3, Donnerstag 6.

Komplexität von Algorithmen

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 10 (Kapitel 11)

Übung Algorithmen und Datenstrukturen

Einführung in die Programmierung

. Die obige Beschreibung der Laufzeit für ein bestimmtes k können wir also erweitern und erhalten die folgende Gleichung für den mittleren Fall:

es gibt Probleme, die nicht berechenbar sind (z.b. Menge aller Funktionen N N und die Menge aller Sprachen sind überabzählbar)

Zahlen und elementares Rechnen

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

2.7 Der Shannon-Fano-Elias Code

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

Datenstrukturen und Algorithmen (SS 2013)

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

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

Datenstrukturen, Algorithmen und Programmierung 2

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

Einstieg in die Informatik mit Java

Wirtschaftsmathematik: Mathematische Grundlagen

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Übersicht. Datenstrukturen und Algorithmen. Die Teile-und-Beherrsche-Methode. Übersicht. Vorlesung 3: Rekursionsgleichungen (K4)

Ordnen Sie die folgenden Funktionen nach ihrer asymptotischer Komplexität in aufsteigender Reihenfolge: i=1 4i + n = 4 n. i=1 i + 3n = 4 ( n(n+1)

1,2,3,4,5,... Dabei ist die Reihenfolge wichtig, jede Zahl hat also ihre feste Position. Die Folge 2,1,4,3,... ist eine andere als 1,2,3,4,...

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Rekursionen (Teschl/Teschl 8.1/8.2)

Informatik II, SS 2016

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen I Grundlagen

Kapitel 3. Konvergenz von Folgen und Reihen

Komplexität von Algorithmen:

Grundlagen: Algorithmen und Datenstrukturen

Numerik für Informatiker

Algorithmen und Datenstrukturen I. Grundlagen. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

2 Wachstumsverhalten von Funktionen

A6.1 Logarithmus. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. A6.1 Logarithmus. A6.2 Landau-Notation. A6.

Prof. Dr. Margarita Esponda

Lineare Algebra I 5. Tutorium Die Restklassenringe /n

2. Algorithmen und Algorithmisierung Algorithmen und Algorithmisierung von Aufgaben

Übung zur Vorlesung Berechenbarkeit und Komplexität

Asymptotik und Laufzeitanalyse

Übungen zu Algorithmentechnik WS 09/10

2. Hausübung Algorithmen und Datenstrukturen

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 7 1. Semester ARBEITSBLATT 7 ADDIEREN UND SUBTRAHIEREN VON TERMEN UND DIE POTENZSCHREIBWEISE

Isomorphismus. Definition Gruppen-Isomorphismus. Seien (G, +) und (G, ) Gruppen. Die Abbildung f : G G heißt Gruppen-Isomorphismus, falls gilt

Zahlen und elementares Rechnen (Teil 1)

5. Äquivalenzrelationen

Informatik II. 1. Einführung. Ziele der Vorlesung. Inhalte der Vorlesung. Vorlesung am D-BAUG der ETH Zürich

Konstruktion reeller Zahlen aus rationalen Zahlen

Vorlesung 3: Graphenalgorithmen. Markus Püschel David Steurer Peter Widmayer. PDF download goo.gl/ym3spq

Dem Anschein nach werden diese Zahlen kleiner und kleiner und streben gegen Null. Was sollen sie sonst auch tun? Aber der Begriff

bekannt Analog reduzieren wir die Randwerte im 2d-System. Man erhält dann eine Blocktridia-

ADDIEREN UND SUBTRAHIEREN VON TERMEN POTENZSCHREIBWEISE

Vorkurs Mathematik und Informatik Mengen, natürliche Zahlen, Induktion

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen Definition, Eigenschaften, Entwurf Darstellung von Algorithmen Beispiele.

Notation für das asymptotische Verhalten von Funktionen

Mathematik I für Studierende der Informatik und Wirtschaftsinformatik (Diskrete Mathematik) im Wintersemester 2015/16

Schleifeninvarianten. Dezimal zu Binär

2. Spezielle anwendungsrelevante Funktionen

Zunächst ein paar einfache "Rechen"-Regeln: Lemma, Teil 1: Für beliebige Funktionen f und g gilt:

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

Musterlösung zum Weihnahchtsübungsblatt. Teil 1 von Martin Fabricius. Aufgabe 1

Analysis 1, Woche 2. Reelle Zahlen. 2.1 Anordnung. Definition 2.1 Man nennt eine Anordnung für K, wenn: 1. Für jeden a K gilt a a (Reflexivität).

Komplexität von Algorithmen Musterlösungen zu ausgewählten Übungsaufgaben

8 Dezimalzahlen und Fehlerfortpflanzung

Rekursionsbäume Aufstellen eines Baumes dessen Knoten die Laufzeit auf jeder Rekursionsstufe darstellen und Aufsummieren

Mathematik II für Studierende der Informatik (Analysis und lineare Algebra) im Sommersemester 2018

Rechenoperationen mit Folgen. Rekursion und Iteration.

5. Äquivalenzrelationen

(b) Man nennt die Menge M beschränkt, wenn sie nach oben und unten beschränkt ist.

Ein Fragment von Pascal

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Analysis I für Studierende der Ingenieurwissenschaften

Teil 1 Gleichungen und Ungleichungen

Mathematik I Herbstsemester 2014

Mathematik I Herbstsemester 2018 Kapitel 2: Stetigkeit

Formale Grundlagen 2008W. Vorlesung im 2008S Institut für Algebra Johannes Kepler Universität Linz

Klausur Algorithmen und Datenstrukturen

Lineare Algebra I (WS 12/13)

1. Rechnerarithmetik und. Rundungsfehler

9. Polynom- und Potenzreihenringe

Informatik II. 1. Einführung. Inhalte der Vorlesung. Ziele der Vorlesung. Vorlesung am D-BAUG der ETH Zürich

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

(alternierendes Vorzeichen) a n := ( 1)n n + 1 a n := 3n 2 7n a n := n(n 1)(n 2), n 3

Transkript:

Kostenmodell Daniel Graf, Tobias Pröger 22. September 2016 (aktualisierte Fassung 5 vom 9. Oktober 2016) Erklärung: Diese Mitschrift ist als Ergänzung zur Vorlesung gedacht. Wir erheben keinen Anspruch auf Vollständigkeit und Korrektheit. Wir sind froh über Hinweise zu Fehlern oder Ungenauigkeiten. Bitte senden Sie diese an tobias.proeger@inf.ethz.ch. 1 Kostenmodell Um die Effizienz von Algorithmen formal zu untersuchen, müssen wir zunächst überlegen, wie wir ihre Kosten bestimmen. Dazu identifizieren wir die für den Algorithmus wesentlichen elementaren Operationen. Beispiele sind Rechenoperationen wie die Addition, Subtraktion, Multiplikation oder Division zweier natürlicher Zahlen, Elementaroperation Vergleichsoperationen wie z.b. <, > oder = zwischen zwei natürlichen Zahlen, Zuweisungen der Form x A, wo der Variable x auf der linken Seite der Zahlenwert des Ausdrucks A auf der rechten Seite zugewiesen wird. Weiter ins Detail, auf die Ebene der einzelnen Bits und Bytes, wollen wir in dieser Vorlesung meist nicht gehen. Wie lange eine einzelne der obengenannten Operationen effektiv dauert, hängt von vielen Faktoren ab: der Taktzahl unserer CPU, der Effizienz des Compilers, der Ausnutzung des Cache-Speichers, der Wahl der Programmiersprache usw. In jedem realen Rechner ist die Laufzeit dieser Operationen aber schlimmstenfalls konstant. Eine erste Idee besteht nun darin, konstante Faktoren ignorieren, da diese von Maschine zu Maschine variieren. Wir weisen nun vereinfachend jeder der obengenannten Operationen die Kosten 1 zu, und sprechen daher auch vom Einheitskostenmodell. Dieses nimmt also an, dass der Aufwand für arithmetische Operationen unabhängig von der Grösse der Operanden ist. Einheitskostenmodell 2 O-Notation Eine weitere Idee ist, dass wir uns nur für grosse Eingabewerte interessieren, bei denen der Algorithmus lange läuft, denn bei kleinen Eingaben ist auch ein naiver Algorithmus vernünftig schnell. Wollen wir zwei Algorithmen miteinander vergleichen, dann ist derjenige besser, der auf grossen Eingaben schneller läuft. Darüber hinaus interessiert uns nur das Wachstum einer Funktion. Um dies mathematisch präzise zu beschreiben, wollen wir erneut vereinfachend alle konstanten Faktoren ignorieren. Eine lineare Wachstumskurve mit Steigung 1 erachten wir als gleich schnell wie eine Kurve mit Steigung 20. Sei f : N R + eine Kostenfunktion. Wir definieren nun eine Menge von Funk- O-Notation 1

Abb. 1 Die Funktion g liegt in O(f), denn für alle n n 0 ist c. tionen, die auch nicht schneller wachsen als f, konkret O(f) := {g : N R + es gibt c > 0, n 0 N so dass c für alle n n 0 }. Beispiele Anschaulich bedeutet dies, dass f (bis auf einen konstanten Faktor) asymptotisch gesehen eine obere Schranke für g bildet (siehe Abbildung 1). Diese O-Notation (auch O-Kalkül oder Bachmann-Landau-Notation genannt) erlaubt uns nun, Ausdrücke zu vereinfachen und nach oben abzuschätzen. So ist z.b. 3n 4 O(n). Dies kann man sehen, indem man etwa c = 3 und n 0 = 1 wählt. Weitere Beispiele sind 2n O(n 2 ) (mit c = 2 und n 0 = 1), n 2 + 100n O(n 2 ) (mit c = 2 und n 0 = 100), Nutzen Addition Ω-Notation n + n O(n) (mit c = 2 und n 0 = 1). Die O-Notation erlaubt es uns also nicht nur, alle Konstanten wegzulassen, wir können auch Terme niedrigerer Ordnung ignorieren. So ist z.b. auch n 2 + n 1,9 + 17 n + 3 lo O(n 2 ). Wir können also für jeden Term den einfachsten Vertreter wählen. Dies ist sinnvoll, da uns, wie vorher erwähnt, nicht die genaue Kostenfunktion, sondern lediglich ihr Wachstumsverhalten (z.b. linear, quadratisch, kubisch, usw.) für grosse n interessiert. Die O-Notation hat einige angenehme Eigenschaften, z.b. abgeschlossen unter Additionen zu sein: Sind sowohl g 1 O(f) als auch g 2 O(f), dann ist auch g 1 + g 2 O(f). Dies sieht man wie folgt: Ist g 1 O(f), dann gibt es Konstanten c 1 > 0 und n 1, sodass g 1 (n) c 1 für alle n n 1 gilt. Analog gibt es Konstanten c 2 > 0 und n 2, sodass g 2 (n) c 2 für alle n n 2 gilt. Wir wählen nun c = c 1 +c 2 sowie n 0 = max{n 1, n 2 }, und sehen dass dann g 1 (n) + g 2 (n) c 1 + c 2 = c für alle n n 0 gilt, was unsere Aussage beweist. Die O-Notation benutzen wir, um obere Schranken anzugeben. Für untere Schranken definieren wir analog Ω(f) := {g : N R + es gibt c > 0, n 0 N so dass c für alle n n 0 }. Θ-Notation Anschaulich bedeutet dies, dass g asymptotisch mindestens so schnell wie f wächst. Liegt eine Funktion g sowohl in O(f) als auch in Ω(f), dann sagen wir, dass sie asymptotisch genauso schnell wie f wächst. Wir schreiben dann auch f Θ(g), und definieren Θ(f) := O(f) Ω(f). Beispiele Um die Konzepte zu vertiefen, betrachten wir nun einige weitere Beispiele. 2

n O(n 2 ): Diese Aussage ist korrekt, aber ungenau. Tatsächlich gelten ja auch n O(n) und sogar n Θ(n). 3n 2 O(2n 2 ): Auch diese Aussage ist korrekt, man würde aber üblicherweise O(n 2 ) statt O(2n 2 ) schreiben, da Konstanten in der O-Notation weggelassen werden können. 2n 2 O(n): Diese Aussage ist falsch, da 2n2 n keine Konstante nach oben beschränkt werden kann. = 2n n und daher durch O(n) O(n 2 ): Diese Aussage ist korrekt, da alle Funktionen, die höchstens linear wachsen, auch nur höchstens quadratisch wachsen. Mathematisch falsch wäre die Aussage O(n) O(n 2 ), da O(n) eine Menge und kein Element ist. Θ(n) Θ(n 2 ): Diese Aussage ist falsch, denn alle Funktionen in Θ(n 2 ) erfüllen auch Ω(n 2 ). Andererseits ist enthält Θ(n) Funktionen wie = n, die nicht in Ω(n 2 ) liegen. Nützlich zur Untersuchung, in welcher Beziehung zwei Funktionen f und g zueinander stehen, ist das folgende Theorem. Theorem 1. Seien f, g : N R + zwei Funktionen. Dann gilt: 1) Ist lim n = 0, dann ist f O(g), und O(f) O(g). O-Notation und Grenzwerte 2) Ist lim n 3) Ist lim n = C > 0 (wobei C konstant ist), dann ist f Θ(g). =, dann ist g O(f), und O(g) O(f). Beweis. Wir beweisen nur die erste Aussage. Der Beweis der übrigen Aussagen verläuft analog. Ist lim n = 0, dann gibt es für jedes ε > 0 ein n 0, sodass < ε für alle n n 0 gilt. Wir können also ein beliebiges ε > 0 wählen, und die Definition des Grenzwerts garantiert uns, dass ein geeignetes n 0 existiert, sodass ε für alle n n 0 gilt. Damit folgt direkt f O(g). Wir wissen daher auch sofort, dass O(f) O(g) gilt. Angenommen, es wäre zusätzlich O(f) = O(g). Dann wäre natürlich auch g O(f). Also gäbe es ein c > 0 und ein n 0, sodass c für alle n n 0 gilt. Dann wäre aber lim n lim 1 n c = 1 c > 0, was ein Widerspruch zur Voraussetzung ist. Also ist O(f) O(g). Üblicherweise schreibt man vereinfachend f = O(g) anstatt f O(g). Mathematisch gesehen ist dies natürlich falsch, da f eine Funktion und O(g) eine Menge bezeichnet. Ausserdem folgt aus f 1 = O(g) und f 2 = O(g) nicht notwendigerweise f 1 = f 2. So zum Beispiel sind sowohl n = O(n 2 ) als auch n 2 = O(n 2 ), aber natürlich ist n n 2. Die Notation ist eher im Sinne des umgangssprachlichen ist ein zu verstehen: Eine Kuh ist ein Tier, aber nicht jedes Tier ist ein Kuh. Gleichungen der Form f = O(g) müssen also von links nach rechts gelesen werden, und weiter rechts Schreibweise 3

wird es möglicherweise ungenauer. So zum Beispiel ist 2n 2 + 1 = O(2n 2 ) = O(n 2 ), und wir erlauben sogar Schreibweisen wie 5n + 7 = O(n) = O(n 2 ). Der zweite Gleichheitszeichen muss also als Teilmengenzeichen interpretiert werden. Diese vereinfachte Schreibweise ist Tradition und hat sich als praktisch erwiesen. Wir erlauben diesen Missbrauch der Notation, wenn aus dem Kontext heraus völlig klar ist, was gemeint ist. Dies heisst aber auch, dass im Zweifelsfall auf jeden Fall die präzise Mengen-basierte Notation verwendet werden sollte! 3 Komplexität, Kosten und Laufzeit Probleme, Algorithmen und Programme Kosten Laufzeit Beziehung Kosten und Laufzeit Komplexität Wir haben bereits früher gesehen, dass Algorithmen verwendet werden, um Probleme zu lösen. Es gibt nun viele Arten, Algorithmen zu beschreiben, etwa textlich (wie wir das beim einfachen Algorithmus zur Lösung des Kuhproblems getan haben), bildlich (z.b. durch Flussdiagramme), durch Pseudocode, oder eben durch richtige Programme. Als Programm bezeichnen wir Code, der auf einem konkreten Rechner (ggf. kompiliert und dann) ausgeführt werden kann. Ein Programm ist also eine konkrete Implementierung eines Algorithmus in einer Programmiersprache. Für jeden Algorithmus können wir nun (zumindest theoretisch) seine Kosten, d.h., die Anzahl der durchgeführten elementaren Operationen, bestimmen. Analog können wir für ein Programm seine Laufzeit (z.b. in Sekunden) messen, wenn es auf einem realen Rechner ausgeführt wird. Gibt es nun eine eindeutige Beziehung zwischen den Kosten eines Algorithmus A und der Laufzeit eines Programms P, das A implementiert? Offensichtlich ist die Laufzeit von P nicht einfach nur ein Vielfaches der Kosten von A, da die Laufzeiten von einer Operation nicht immer gleich sind. Denken wir etwa an die Addition zweier Zahlen: Befinden sich diese bereits im Speicher, dann kann die Operation vermutlich schneller ausgeführt werden, als wenn die Zahlen erst von einem Externspeicher (z.b. einer langsamen Festplatte) gelesen werden müssten. Wir beobachten aber auch, dass auf einem konkreten Rechner die Laufzeit jeder Operation durch eine Konstante sowohl nach unten, als auch nach oben beschränkt werden kann. Prozessorkerne in modernen Rechnern arbeiten oft mit 3GHz oder mehr, d.h., es gibt 3 10 9 Takte pro Sekunde. Pro Takt können eine bestimmte Anzahl Operationen ausgeführt werden (z.b. 8), also gibt es eine untere Schranke. Auch eine obere Schranke können wir angeben: Mit Sicherheit dauert eine einzelne Operation auf einem realen Rechner niemals länger als eine Stunde. Diese Konstanten für die untere und die obere Schranke liegen natürlich sehr weit auseinander. Wir beobachten aber, dass die Kosten eines Algorithmus und die Laufzeit einer Implementierung asymptotisch gesehen übereinstimmen. Können wir von den Kosten eines Algorithmus auch auf die Schwierigkeit des zugrundeliegenden Problems schliessen? Ja, aber wir erhalten lediglich eine obere Schranke. Es könnte nämlich andere Algorithmen geben, die wir noch nicht kennen, und die das Problem mit geringeren Kosten lösen. Wir definieren also die Komplexität eines Problems P als die minimalen Kosten über alle Algorithmen A, die P lösen. Da die Menge aller Algorithmus unendlich gross ist, können wir nur für wenige Probleme die Komplexität exakt angeben. Die Komplexität der Multiplikation zweier Zahlen der Länge n ist offenbar in Ω(n), denn jede Ziffer der Eingabe muss berücksichtigt werden. Ebenso ist sie in O(n log 3 (2) ), denn der Algorithmus von Karatsuba und Ofman hat genau diese Kosten. Abbildung 2 zeigt die Beziehungen zwischen den definierten Begriffen. 4

Problem Komplexität O(n) O(n) O(n 2 ) Algorithmus Kosten (# el. Op.) 3n 4 O(n) Θ(n 2 ) Programm Laufzeit (Sek.) Θ(n) O(n) Θ(n 2 ) Abb. 2 Beziehungen zwischen der Komplexität eines Problems, den Kosten eines Algorithmus für dieses Problem und der Laufzeit einer Implementierung von diesem Algorithmus. 5