Dennis Komm Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 27. Februar 2019
Komplexität von Algorithmen
Aufgabe Primzahltest Schreibe ein Programm, das eine ganze Zahl x als Eingabe erhält berechnet, ob x eine Primzahl ist dabei den %-Operator verwendet davon abhängig Primzahl oder einen Teiler von x ausgibt Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 1 / 35
Primzahltest public class PrimeTest { public static void main(string[] args) { Out.print("Input number: "); int x = In.readInt(); int d = 2; while (d < x) { if (x % d == 0) { Out.println("No prime number, divisor: " + d); return; } d += 1; } Out.println("Prime number"); } } Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 2 / 35
Primzahltest Wie lange braucht der Algorithmus, um Ausgabe zu erzeugen? Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 3 / 35
Primzahltest Wie lange braucht der Algorithmus, um Ausgabe zu erzeugen? Was ist seine Laufzeit? Hängt von Anzahl Schleifendurchläufe ab Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 3 / 35
Primzahltest Wie lange braucht der Algorithmus, um Ausgabe zu erzeugen? Was ist seine Laufzeit? Hängt von Anzahl Schleifendurchläufe ab Absoluter Wert ergibt keinen Sinn Schleife wird (ungefähr) x Mal durchlaufen (wenn x prim ist) Laufzeit wächst mit x Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 3 / 35
Primzahltest Wie lange braucht der Algorithmus, um Ausgabe zu erzeugen? Was ist seine Laufzeit? Hängt von Anzahl Schleifendurchläufe ab Absoluter Wert ergibt keinen Sinn Schleife wird (ungefähr) x Mal durchlaufen (wenn x prim ist) Laufzeit wächst mit x... aber wie schnell? Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 3 / 35
Laufzeit Funktion der Eingabelänge Wir messen Laufzeit als Funktion der Eingabelänge Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 4 / 35
Laufzeit Funktion der Eingabelänge Wir messen Laufzeit als Funktion der Eingabelänge Für unseren Algorithmus ist die Eingabe eine Zahl x Zahlen werden im Computer binär dargestellt Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 4 / 35
Laufzeit Funktion der Eingabelänge Wir messen Laufzeit als Funktion der Eingabelänge Für unseren Algorithmus ist die Eingabe eine Zahl x Zahlen werden im Computer binär dargestellt Wenn wir führende Nullen ignorieren, gilt für n Bits 2 n 1 ist 10 }.{{.. 00}, 2 n 1 + 1 ist 10 }.{{.. 01},... und 2 n 1 ist 11 }.{{.. 11} n n n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 4 / 35
Laufzeit Funktion der Eingabelänge Wir messen Laufzeit als Funktion der Eingabelänge Für unseren Algorithmus ist die Eingabe eine Zahl x Zahlen werden im Computer binär dargestellt Wenn wir führende Nullen ignorieren, gilt für n Bits 2 n 1 ist 10 }.{{.. 00}, 2 n 1 + 1 ist 10 }.{{.. 01},... und 2 n 1 ist 11 }.{{.. 11} n n n Eine Zahl, die mit n Bits dargestellt wird, hat ungefähr die Grösse 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 4 / 35
Laufzeit Technologiemodell Random Access Machine Ausführungsmodell: Instruktionen werden der Reihe nach (auf einem Prozessorkern) ausgeführt Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 5 / 35
Laufzeit Technologiemodell Random Access Machine Ausführungsmodell: Instruktionen werden der Reihe nach (auf einem Prozessorkern) ausgeführt Speichermodell: Konstante Zugriffszeit Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 5 / 35
Laufzeit Technologiemodell Random Access Machine Ausführungsmodell: Instruktionen werden der Reihe nach (auf einem Prozessorkern) ausgeführt Speichermodell: Konstante Zugriffszeit Elementare Operationen: Rechenoperation (+,,,... ), Vergleichsoperationen, Zuweisung / Kopieroperation, Flusskontrolle (Sprünge) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 5 / 35
Laufzeit Technologiemodell Random Access Machine Ausführungsmodell: Instruktionen werden der Reihe nach (auf einem Prozessorkern) ausgeführt Speichermodell: Konstante Zugriffszeit Elementare Operationen: Rechenoperation (+,,,... ), Vergleichsoperationen, Zuweisung / Kopieroperation, Flusskontrolle (Sprünge) Einheitskostenmodell: Elementare Operation hat Kosten 1 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 5 / 35
Laufzeit Technologiemodell Random Access Machine Ausführungsmodell: Instruktionen werden der Reihe nach (auf einem Prozessorkern) ausgeführt Speichermodell: Konstante Zugriffszeit Elementare Operationen: Rechenoperation (+,,,... ), Vergleichsoperationen, Zuweisung / Kopieroperation, Flusskontrolle (Sprünge) Einheitskostenmodell: Elementare Operation hat Kosten 1 Datentypen: Fundamentaltypen wie grössenbeschränkte Ganzzahl oder Fliesskommazahl Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 5 / 35
Laufzeit Anmerkung Wir sind an dieser Stelle nicht ganz exakt Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 6 / 35
Laufzeit Anmerkung Wir sind an dieser Stelle nicht ganz exakt Wenn unsere Eingabe als int kodiert ist, hat sie immer dieselbe Länge Es existieren Java-Datentypen für beliebig grosse Zahlen, die wir hier aber nicht verwenden Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 6 / 35
Laufzeit Anmerkung Wir sind an dieser Stelle nicht ganz exakt Wenn unsere Eingabe als int kodiert ist, hat sie immer dieselbe Länge Es existieren Java-Datentypen für beliebig grosse Zahlen, die wir hier aber nicht verwenden Die Kodierung einer Fliesskommazahl kann man nicht sofort aus ihrer Grösse ablesen Eine Addition ist sicherlich schneller zu bewältigen als eine Multiplikation Die Zeit der Addition zweier n-bit-zahlen hängt von n ab Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 6 / 35
Laufzeit Anmerkung Wir sind an dieser Stelle nicht ganz exakt Wenn unsere Eingabe als int kodiert ist, hat sie immer dieselbe Länge Es existieren Java-Datentypen für beliebig grosse Zahlen, die wir hier aber nicht verwenden Die Kodierung einer Fliesskommazahl kann man nicht sofort aus ihrer Grösse ablesen Eine Addition ist sicherlich schneller zu bewältigen als eine Multiplikation Die Zeit der Addition zweier n-bit-zahlen hängt von n ab Logarithmisches Kostenmodell berücksichtigt dies, verwenden wir aber ebenfalls nicht Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 6 / 35
Komplexität von Algorithmen Laufzeit unseres Primzahltests
Laufzeit unseres Primzahltests Angenommen, x ist eine Primzahl und mit n Bits dargestellt Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 7 / 35
Laufzeit unseres Primzahltests Angenommen, x ist eine Primzahl und mit n Bits dargestellt Anzahl Schleifendurchläufe wächst mit Grösse von x 2 n Die Schleife wird also ca. 2 n Mal ausgeführt Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 7 / 35
Laufzeit unseres Primzahltests Angenommen, x ist eine Primzahl und mit n Bits dargestellt Anzahl Schleifendurchläufe wächst mit Grösse von x 2 n Die Schleife wird also ca. 2 n Mal ausgeführt Wir wollen elementare Operationen zählen Algorithmus führt vier Operationen pro Iteration aus Insgesamt ca. 4 2 n Operationen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 7 / 35
Laufzeit unseres Primzahltests Angenommen, x ist eine Primzahl und mit n Bits dargestellt Anzahl Schleifendurchläufe wächst mit Grösse von x 2 n Die Schleife wird also ca. 2 n Mal ausgeführt Wir wollen elementare Operationen zählen Algorithmus führt vier Operationen pro Iteration aus Insgesamt ca. 4 2 n Operationen Uns interessiert, wie sich Laufzeit verhält, wenn n wächst Ignoriere Konstante 4 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 7 / 35
Komplexität von Algorithmen Asymptotische obere Schranken
Asymptotische obere Schranken Genaue Laufzeit lässt sich selbst für kleine Eingaben kaum voraussagen Uns interessieren obere Schranken Betrachte das asymptotische Verhalten eines Algorithmus Ignoriere alle konstanten Faktoren Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 8 / 35
Asymptotische obere Schranken Genaue Laufzeit lässt sich selbst für kleine Eingaben kaum voraussagen Uns interessieren obere Schranken Betrachte das asymptotische Verhalten eines Algorithmus Ignoriere alle konstanten Faktoren Beispiel Lineares Wachstum mit Steigung 5 ist genauso gut wie lineares Wachstum mit Steigung 1 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 8 / 35
Asymptotische obere Schranken Genaue Laufzeit lässt sich selbst für kleine Eingaben kaum voraussagen Uns interessieren obere Schranken Betrachte das asymptotische Verhalten eines Algorithmus Ignoriere alle konstanten Faktoren Beispiel Lineares Wachstum mit Steigung 5 ist genauso gut wie lineares Wachstum mit Steigung 1 Quadratisches Wachstum mit Koeffizient 10 ist genauso gut wie quadratisches Wachstum mit Koeffizient 1 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 8 / 35
Asymptotische obere Schranken Gross-O-Notation Die Menge O(2 n ) enthält alle Funktionen, die nicht schneller wachsen als c 2 n für eine Konstante c Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 9 / 35
Asymptotische obere Schranken Gross-O-Notation Die Menge O(2 n ) enthält alle Funktionen, die nicht schneller wachsen als c 2 n für eine Konstante c O(g(n)) enthält alle Funktionen f(n), die nicht schneller wachsen als c g(n) für eine Konstante c, wobei f und g positiv sind Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 9 / 35
Asymptotische obere Schranken Gross-O-Notation Die Menge O(2 n ) enthält alle Funktionen, die nicht schneller wachsen als c 2 n für eine Konstante c O(g(n)) enthält alle Funktionen f(n), die nicht schneller wachsen als c g(n) für eine Konstante c, wobei f und g positiv sind Verwende die asymptotische Notation zur Kennzeichnung der Laufzeit von Algorithmen Wir schreiben O(n 2 ) und meinen, dass der Algorithmus sich für grosse n (maximal) wie n 2 verhält: verdoppelt sich die Eingabelänge, so vervierfacht sich die Laufzeit (maximal) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 9 / 35
Asymptotische obere Schranken Formale Definition Gross-O-Notation Formale Definition Für jede Funktion g : N R + ist O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 10 / 35
Asymptotische obere Schranken Formale Definition Gross-O-Notation Formale Definition Für jede Funktion g : N R + ist O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} Wir verwenden O(g) und O(g(n)) synonym Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 10 / 35
Asymptotische obere Schranken Formale Definition Gross-O-Notation Formale Definition Für jede Funktion g : N R + ist O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} Wir verwenden O(g) und O(g(n)) synonym Sie finden in der Literatur oftmals f = O(g) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 10 / 35
Asymptotische obere Schranken Formale Definition Gross-O-Notation Formale Definition Für jede Funktion g : N R + ist O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} Wir verwenden O(g) und O(g(n)) synonym Sie finden in der Literatur oftmals f = O(g) Dies ist zu verstehen als f O(g) Denn aus f 1 = O(g) und f 2 = O(g) folgt natürlich nicht f 1 = f 2 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 10 / 35
Asymptotische obere Schranken Anschauung g(n) = n 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 11 / 35
Asymptotische obere Schranken Anschauung g(n) = n 2 f O(g) n 0 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 11 / 35
Asymptotische obere Schranken Anschauung g(n) = n 2 f O(g) h O(g) n 0 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 11 / 35
Asymptotische obere Schranken Beispiele O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} f(n) f O(?) Beispiel 3n + 4 2n n 2 + 100n n + n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 12 / 35
Asymptotische obere Schranken Beispiele O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} f(n) f O(?) Beispiel 3n + 4 O(n) c = 4, n 0 = 4 2n n 2 + 100n n + n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 12 / 35
Asymptotische obere Schranken Beispiele O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} f(n) f O(?) Beispiel 3n + 4 O(n) c = 4, n 0 = 4 2n O(n) c = 2, n 0 = 0 n 2 + 100n n + n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 12 / 35
Asymptotische obere Schranken Beispiele O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} f(n) f O(?) Beispiel 3n + 4 O(n) c = 4, n 0 = 4 2n O(n) c = 2, n 0 = 0 n 2 + 100n O(n 2 ) c = 2, n 0 = 100 n + n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 12 / 35
Asymptotische obere Schranken Beispiele O(g(n)) = {f : N R + c > 0, n 0 N: n n 0 : f(n) c g(n)} f(n) f O(?) Beispiel 3n + 4 O(n) c = 4, n 0 = 4 2n O(n) c = 2, n 0 = 0 n 2 + 100n O(n 2 ) c = 2, n 0 = 100 n + n O(n) c = 2, n 0 = 1 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 12 / 35
Asymptotische obere Schranken Eigenschaft f 1 O(g) und f 2 O(g) impliziert f 1 + f 2 O(g) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 13 / 35
Asymptotische obere Schranken Eigenschaft f 1 O(g) und f 2 O(g) impliziert f 1 + f 2 O(g) Es existieren n 1, c 1, sodass für alle n > n 1 gilt, dass f 1 (n) c 1 g(n) Ferner existieren n 2, c 2, sodass für alle n > n 2 gilt, dass f 2 (n) c 2 g(n) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 13 / 35
Asymptotische obere Schranken Eigenschaft f 1 O(g) und f 2 O(g) impliziert f 1 + f 2 O(g) Es existieren n 1, c 1, sodass für alle n > n 1 gilt, dass f 1 (n) c 1 g(n) Ferner existieren n 2, c 2, sodass für alle n > n 2 gilt, dass f 2 (n) c 2 g(n) Sei n 0 := max{n 1, n 2 } und c := max{c 1, c 2 } Dann ist f 1 (n) c g(n) und f 2 (n) c g(n) für alle n n 0 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 13 / 35
Asymptotische obere Schranken Eigenschaft f 1 O(g) und f 2 O(g) impliziert f 1 + f 2 O(g) Es existieren n 1, c 1, sodass für alle n > n 1 gilt, dass f 1 (n) c 1 g(n) Ferner existieren n 2, c 2, sodass für alle n > n 2 gilt, dass f 2 (n) c 2 g(n) Sei n 0 := max{n 1, n 2 } und c := max{c 1, c 2 } Dann ist f 1 (n) c g(n) und f 2 (n) c g(n) für alle n n 0 Also gilt f 1 (n) + f 2 (n) 2 c g(n) für alle n n 0 Somit folgt, dass f 1 + f 2 in O(g) ist Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 13 / 35
Komplexität von Algorithmen Asymptotische untere Schranken
Asymptotische untere Schranken Formale Definition Gross-Ω-Notation Formale Definition Für jede Funktion g : N R + ist Ω(g) = {f : N R c > 0, n 0 N: n n 0 : c g(n) f(n)} Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 14 / 35
Asymptotische untere Schranken Anschauung g(n) = n n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 15 / 35
Asymptotische untere Schranken Anschauung f Ω(g) g(n) = n n 0 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 15 / 35
Asymptotische untere Schranken Anschauung h Ω(g) f Ω(g) g(n) = n n 0 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 15 / 35
Komplexität von Algorithmen Asymptotische scharfe Schranken
Asymptotisch scharfe Schranke Formale Definition Definition Für jede Funktion g : N R + ist Θ(g) = Ω(g) O(g) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 16 / 35
Asymptotisch scharfe Schranke Anschauung f Θ(n 2 ) n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 17 / 35
Asymptotisch scharfe Schranke Anschauung f Θ(n 2 ) h(n) = 0.5 n 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 17 / 35
Asymptotisch scharfe Schranke Anschauung g(n) = n 2 f Θ(n 2 ) h(n) = 0.5 n 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 17 / 35
Komplexität von Algorithmen Laufzeit-Analyse
Wachstumsbezeichnungen Funktion in Beschreibung Beispiel O(1) konstant Array-Zugriff O(log n) logarithmisch Binäre sortierte Suche O(n) linear Unsortierte naive Suche O(n log n) superlinear / loglinear Gute Sortieralgorithmen O(n 2 ) quadratisch Einfache Sortieralgorithmen O(n c ) polynomiell Matrixmultiplikation O(2 n ) exponentiell Traveling Salesman Dynamic Programming O(n!) faktoriell Traveling Salesman naiv Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 18 / 35
Kleine n 60 n 4 2 n 40 n 2 20 0 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 n ln n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 19 / 35
Grössere n 1 10 6 2 n 0.8 0.6 0.4 n 4 0.2 0 n 2 2 4 6 8 10 12 14 16 18 20 22 24log n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 20 / 35
Grosse n 1 1020 0.8 2 n 0.6 0.4 0.2 0 n 4 n 2 10 20 30 40 50 60 70 80 90 100log n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 21 / 35
Logarithmen 1,000 n 2 800 600 400 200 0 n 3/2 n log n n 5 10 15 20 25 30 35 40 45 log n 50 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 22 / 35
Zeitbedarf Nehmen wir an, 1 elementare Operation braucht 1µs Eingabelänge 1 100 10000 10 6 10 9 log 2 n 1µs n 1µs n log 2 n 1µs n 2 1µs 2 n 1µs Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 23 / 35
Zeitbedarf Nehmen wir an, 1 elementare Operation braucht 1µs Eingabelänge 1 100 10000 10 6 10 9 log 2 n 1µs 7µs 13µs 20µs 30µs n 1µs n log 2 n 1µs n 2 1µs 2 n 1µs Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 23 / 35
Zeitbedarf Nehmen wir an, 1 elementare Operation braucht 1µs Eingabelänge 1 100 10000 10 6 10 9 log 2 n 1µs 7µs 13µs 20µs 30µs n 1µs 100µs 1/100s 1s 17 Minuten n log 2 n 1µs n 2 1µs 2 n 1µs Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 23 / 35
Zeitbedarf Nehmen wir an, 1 elementare Operation braucht 1µs Eingabelänge 1 100 10000 10 6 10 9 log 2 n 1µs 7µs 13µs 20µs 30µs n 1µs 100µs 1/100s 1s 17 Minuten n log 2 n 1µs 700µs 13/100µs 20s 8.5 Stunden n 2 1µs 2 n 1µs Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 23 / 35
Zeitbedarf Nehmen wir an, 1 elementare Operation braucht 1µs Eingabelänge 1 100 10000 10 6 10 9 log 2 n 1µs 7µs 13µs 20µs 30µs n 1µs 100µs 1/100s 1s 17 Minuten n log 2 n 1µs 700µs 13/100µs 20s 8.5 Stunden n 2 1µs 1/100s 1.7 Minuten 11.5 Tage 317 Jahrhund. 2 n 1µs Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 23 / 35
Zeitbedarf Nehmen wir an, 1 elementare Operation braucht 1µs Eingabelänge 1 100 10000 10 6 10 9 log 2 n 1µs 7µs 13µs 20µs 30µs n 1µs 100µs 1/100s 1s 17 Minuten n log 2 n 1µs 700µs 13/100µs 20s 8.5 Stunden n 2 1µs 1/100s 1.7 Minuten 11.5 Tage 317 Jahrhund. 2 n 1µs 10 14 Jahrh. Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 23 / 35
Einfluss schnellerer Computer Na gut... dann kaufe ich mir eben eine neue Maschine. Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 24 / 35
Einfluss schnellerer Computer Na gut... dann kaufe ich mir eben eine neue Maschine. Wenn aktuelle Maschine Eingaben der Länge n lösen kann, dann kann eine 10 oder 100 Mal so schnelle Maschine... Komplexität (Geschwindigkeit 10) (Geschwindigkeit 100) log 2 n n n 2 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 24 / 35
Einfluss schnellerer Computer Na gut... dann kaufe ich mir eben eine neue Maschine. Wenn aktuelle Maschine Eingaben der Länge n lösen kann, dann kann eine 10 oder 100 Mal so schnelle Maschine... Komplexität (Geschwindigkeit 10) (Geschwindigkeit 100) log 2 n n n 10 n n 100 n n 2 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 24 / 35
Einfluss schnellerer Computer Na gut... dann kaufe ich mir eben eine neue Maschine. Wenn aktuelle Maschine Eingaben der Länge n lösen kann, dann kann eine 10 oder 100 Mal so schnelle Maschine... Komplexität (Geschwindigkeit 10) (Geschwindigkeit 100) log 2 n n n 10 n n 100 n n 10 n n 100 n n 2 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 24 / 35
Einfluss schnellerer Computer Na gut... dann kaufe ich mir eben eine neue Maschine. Wenn aktuelle Maschine Eingaben der Länge n lösen kann, dann kann eine 10 oder 100 Mal so schnelle Maschine... Komplexität (Geschwindigkeit 10) (Geschwindigkeit 100) log 2 n n n 10 n n 100 n n 10 n n 100 n n 2 n 3.16 n n 10 n 2 n Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 24 / 35
Einfluss schnellerer Computer Na gut... dann kaufe ich mir eben eine neue Maschine. Wenn aktuelle Maschine Eingaben der Länge n lösen kann, dann kann eine 10 oder 100 Mal so schnelle Maschine... Komplexität (Geschwindigkeit 10) (Geschwindigkeit 100) log 2 n n n 10 n n 100 n n 10 n n 100 n n 2 n 3.16 n n 10 n 2 n n n + 3.32 n n + 6.64 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 24 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) ist falsch, denn 2n2 cn = 2 n ist nicht konstant c Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) ist falsch, denn 2n2 cn O(n) O(n 2 ) = 2 n ist nicht konstant c Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) ist falsch, denn 2n2 cn O(n) O(n 2 ) ist korrekt, = 2 n ist nicht konstant c Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) ist falsch, denn 2n2 = 2 n ist nicht konstant cn c O(n) O(n 2 ) ist korrekt, Θ(n) Θ(n 2 ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) ist falsch, denn 2n2 = 2 n ist nicht konstant cn c O(n) O(n 2 ) ist korrekt, Θ(n) Θ(n 2 ) ist falsch: Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Asymptotische Komplexität Beispiele n O(n 2 ) ist korrekt, aber ungenau: n O(n) und sogar n Θ(n) 3n 2 O(2n 2 ) ist korrekt, aber unüblich: Konstanten weglasssen: 3n 2 O(n 2 ) 2n 2 O(n) ist falsch, denn 2n2 = 2 n ist nicht konstant cn c O(n) O(n 2 ) ist korrekt, Θ(n) Θ(n 2 ) ist falsch: n Ω(n 2 ) Θ(n 2 ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 25 / 35
Problem-Komplexität Definition Die Komplexität eines Problems P entspricht den minimalen (asymptotischen) Kosten über alle Algorithmen, die P lösen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 26 / 35
Problem-Komplexität Definition Die Komplexität eines Problems P entspricht den minimalen (asymptotischen) Kosten über alle Algorithmen, die P lösen Obere Schranken durch Angabe eines Algorithmus Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 26 / 35
Problem-Komplexität Definition Die Komplexität eines Problems P entspricht den minimalen (asymptotischen) Kosten über alle Algorithmen, die P lösen Obere Schranken durch Angabe eines Algorithmus Zu testen, ob eine n-bit-zahl prim ist, hat Komplexität in O(2 n ) Sortieren von n Zahlen vom Typ int hat Komplexität in O(n log n) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 26 / 35
Problem-Komplexität Definition Die Komplexität eines Problems P entspricht den minimalen (asymptotischen) Kosten über alle Algorithmen, die P lösen Obere Schranken durch Angabe eines Algorithmus Zu testen, ob eine n-bit-zahl prim ist, hat Komplexität in O(2 n ) Sortieren von n Zahlen vom Typ int hat Komplexität in O(n log n) Untere Schranken sind viel schwerer zu zeigen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 26 / 35
Problem-Komplexität Definition Die Komplexität eines Problems P entspricht den minimalen (asymptotischen) Kosten über alle Algorithmen, die P lösen Obere Schranken durch Angabe eines Algorithmus Zu testen, ob eine n-bit-zahl prim ist, hat Komplexität in O(2 n ) Sortieren von n Zahlen vom Typ int hat Komplexität in O(n log n) Untere Schranken sind viel schwerer zu zeigen Stärkere Schranken als Ω(n) nur unter Zusatzannahmen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 26 / 35
Ein schnellerer Primzahltest Erster Versuch
Ein schnellerer Primzahltest Ziel Laufzeit ausserhalb Ω(2 n ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 27 / 35
Ein schnellerer Primzahltest Ziel Laufzeit ausserhalb Ω(2 n ) Beobachtung Wenn x nicht durch 2 teilbar ist, dann ist sie auch nicht durch 4 oder 6 oder 8 etc. teilbar Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 27 / 35
Ein schnellerer Primzahltest Ziel Laufzeit ausserhalb Ω(2 n ) Beobachtung Wenn x nicht durch 2 teilbar ist, dann ist sie auch nicht durch 4 oder 6 oder 8 etc. teilbar Es reicht dann nur ungerade Zahlen zu testen Algorithmus muss nur noch die Hälfte der Zahlen testen Schleife wird nur noch x/2 Mal durchlaufen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 27 / 35
Ein schnellerer Primzahltest Out.print("Input number: "); int x = In.readInt(); if (x % 2 == 0) { Out.println("Even number"); return; } int d = 3; while (d < x) { if (x % d == 0) { Out.println("No prime number, divisor: " + d); return; } d += 2; } Out.println("Prime number"); Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 28 / 35
Ein schnellerer Primzahltest Out.print("Input number: "); int x = In.readInt(); if (x % 2 == 0) { Out.println("Even number"); return; } int d = 3; while (d < x) { if (x % d == 0) { Out.println("No prime number, divisor: " + d); return; } d += 2; } Out.println("Prime number"); Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 28 / 35
Ein schnellerer Primzahltest Wie gross ist die Verbesserung? Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 29 / 35
Ein schnellerer Primzahltest Wie gross ist die Verbesserung? Schleife wird ca. x/2 Mal durchlaufen anstatt x Mal Laufzeit verbessert sich um Faktor 2 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 29 / 35
Ein schnellerer Primzahltest Wie gross ist die Verbesserung? Schleife wird ca. x/2 Mal durchlaufen anstatt x Mal Laufzeit verbessert sich um Faktor 2 Sei x wieder mit n Bits dargestellt Insgesamt ca. 4 2 n /2 = 2 2 n elementare Operationen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 29 / 35
Ein schnellerer Primzahltest Wie gross ist die Verbesserung? Schleife wird ca. x/2 Mal durchlaufen anstatt x Mal Laufzeit verbessert sich um Faktor 2 Sei x wieder mit n Bits dargestellt Insgesamt ca. 4 2 n /2 = 2 2 n elementare Operationen Laufzeit noch immer in Ω(2 n ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 29 / 35
Ein schnellerer Primzahltest Wie gross ist die Verbesserung? Schleife wird ca. x/2 Mal durchlaufen anstatt x Mal Laufzeit verbessert sich um Faktor 2 Sei x wieder mit n Bits dargestellt Insgesamt ca. 4 2 n /2 = 2 2 n elementare Operationen Laufzeit noch immer in Ω(2 n ) Keine asymptotische Verbesserung Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 29 / 35
Ein schnellerer Primzahltest Zweiter Versuch
Ein schnellerer Primzahltest Beobachtung Wenn x keine Primzahl ist, dann ist x teilbar durch eine Zahl a mit 1 < a < x Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 30 / 35
Ein schnellerer Primzahltest Beobachtung Wenn x keine Primzahl ist, dann ist x teilbar durch eine Zahl a mit 1 < a < x Dann ist x auch durch Zahl b teilbar mit a b = x und 1 < b < x Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 30 / 35
Ein schnellerer Primzahltest Beobachtung Wenn x keine Primzahl ist, dann ist x teilbar durch eine Zahl a mit 1 < a < x Dann ist x auch durch Zahl b teilbar mit a b = x und 1 < b < x Es kann nicht sein, dass a > x und b > x, denn sonst wäre a b > x Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 30 / 35
Ein schnellerer Primzahltest public class PrimeTest { public static void main(string[] args) { Out.print("Input number: "); int x = In.readInt(); int d = 2; while (d < x) { if (x % d == 0) { Out.println("No prime number, divisor: " + d); return; } d += 1; } Out.println("Prime number"); } } Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 31 / 35
Ein schnellerer Primzahltest public class PrimeTest { public static void main(string[] args) { Out.print("Input number: "); int x = In.readInt(); int d = 2; while (d <= Math.sqrt(x)) { if (x % d == 0) { Out.println("No prime number, divisor: " + d); return; } d += 1; } Out.println("Prime number"); } } Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 31 / 35
Ein schnellerer Primzahltest Übung Wie gross ist diesmal die Verbesserung? Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 32 / 35
Ein schnellerer Primzahltest Übung Wie gross ist diesmal die Verbesserung? Was ist die Laufzeit dieses Algorithmus? Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 32 / 35
Ein schnellerer Primzahltest Übung Wie gross ist diesmal die Verbesserung? Was ist die Laufzeit dieses Algorithmus? Schleife wird x Mal durchlaufen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 32 / 35
Ein schnellerer Primzahltest Übung Wie gross ist diesmal die Verbesserung? Was ist die Laufzeit dieses Algorithmus? Schleife wird x Mal durchlaufen Laufzeit wächst mit Grösse des Werts von x Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 32 / 35
Ein schnellerer Primzahltest Übung Wie gross ist diesmal die Verbesserung? Was ist die Laufzeit dieses Algorithmus? Schleife wird x Mal durchlaufen Laufzeit wächst mit Grösse des Werts von x Laufzeit in O( 2 n ) Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 32 / 35
Ein schnellerer Primzahltest Übung 10,000,000 5,000,000 0 5 10 15 20 25 30 35 40 45 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 33 / 35
Ein schnellerer Primzahltest Übung 10,000,000 5,000,000 2 n 0 5 10 15 20 25 30 35 40 45 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 33 / 35
Ein schnellerer Primzahltest Übung 10,000,000 5,000,000 2 n 2 n 0 5 10 15 20 25 30 35 40 45 Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 33 / 35
Ein schnellerer Primzahltest Best- und Worst-Case-Analyse
Best- und Worst-Case-Analyse Welcher Algorithmus ist schneller? Out.print("Input number: "); int x = In.readInt(); int d = 2; while (d < Math.sqrt(x)) { if (x % d == 0) { Out.println("Composite number"); return; } d = d + 1; } Out.println("Prime number"); Out.print("Input number: "); int x = In.readInt(); int d = 2; boolean isprime = true; while (d < Math.sqrt(x)) { if (x % d == 0) { isprime = false; } d = d + 1; } if (isprime == true) { Out.println("Prime number"); } else { Out.println("Composite number"); } Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 34 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Schleife wird nach dem ersten Vergleich verlassen Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Schleife wird nach dem ersten Vergleich verlassen Early Exit Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Schleife wird nach dem ersten Vergleich verlassen Early Exit Rechter Algorithmus macht ca. 2 n Vergleiche Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Schleife wird nach dem ersten Vergleich verlassen Early Exit Rechter Algorithmus macht ca. 2 n Vergleiche Angenommen, x ist Primzahl Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Schleife wird nach dem ersten Vergleich verlassen Early Exit Rechter Algorithmus macht ca. 2 n Vergleiche Angenommen, x ist Primzahl Dann machen beide Algorithmen ca. 2 n Vergleiche Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Best- und Worst-Case-Analyse Angenommen, x ist gerade Zahl Dann ist der linke Algorithmus sehr schnell Schleife wird nach dem ersten Vergleich verlassen Early Exit Rechter Algorithmus macht ca. 2 n Vergleiche Angenommen, x ist Primzahl Dann machen beide Algorithmen ca. 2 n Vergleiche ( ) Natürlich sollte der linke implementiert werden Programmieren und Problemlösen Komplexität von Algorithmen Frühling 2019 Dennis Komm 35 / 35
Danke für die Aufmerksamkeit