Algorithmen und Datenstrukturen Wintersemester 2016/17 4. Vorlesung Laufzeitanalyse – Beispiele Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I Analyse von Aktienkursen Geld [ ] Quelle: http://www.finanzen.net/chart/Nordex Profit Wichtig: Es genügt nicht Minimum und Maximum zu suchen! Zeit [Tage] Problem. Gegeben: Folge A[1..n] von Aktienkursen in Euro. Gesucht: Paar (i , j ) mit 1 ≤ i < j ≤ n, so dass A[j ] − A[i ] maximal. {z } Einkaufskurs Verkaufskurs | Profit pro Aktie Analyse von Aktienkursen Problem: Gegeben: Folge A[1..n] von ganzen Zahlen M AXGesucht: Paar (i , j ) mit 1 ≤ i < j ≤ n, DIFF so dass A[ j ] − A[i ] maximal. Lösung: per roher Gewalt“ ” – für alle erlaubten Paare (i , j ) berechne A[ j ] − A[i ] – gib Maximum zurück Laufzeit ≈ Anzahl erlaubter Paare = = (n − 1) + (n − 2) + . . . + 2 + 1 n2 − n = 2 ∈ Θ (n2 ) Ein ähnliches Problem Problem: Gegeben: Folge A[1..n] von ganzen Zahlen M AX) mit 1 ≤ i ≤ j ≤ n, Gesucht: Paar (i , jP SUM j so dass k =i A[k ] maximal. 7 4 - 9 1 - 3 3 1 12 0 - 2 0 4 2 -8 2 1 Lösung: Übung: Schreiben Sie Pseudocode! Laufzeit 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ⇒ (6, 13) oder (1, 13) per roher Gewalt“ ” Pj – für alle erlaubten Paare (i , j ) berechne k =i A[k ] – gib Maximum zurück ≈ Anzahl der Additionen O (n 2 ) · O (n ) = O (n 3 ) Obere Schranke dafür: = Ω (n 2 ) Untere Schranke (Anz. Paare) Wo ist die Wahrheit? Genauere Analyse Laufzeit ≈ Anzahl der Additionen des Rohe-Gewalt-Algos: Pj – für alle erlaubten Paare (i , j ) berechne k =i A[k ] s – gib Maximum zurück n Beob. Anz. der Summen mit s Summanden ist n − s + 1. s Summanden benötigen s − 1 Additionen. Pn ⇒ Anz. Add. = s =1 (n − s + 1) · (s − 1) = n · 0 + (n − 1) · 1 + (n − 2) · 2 + . . . + 2 · (n − 2) + 1 · (n − 1) = ··· + n 2 3n 4 · n 4 + ··· + n 2 · n 2 + ··· + n 4 · 3n 4 ∈ Ω (n3 ) + ... | {z } + 1 Terme der Größe mindestens n 4 · n 4 Übung: Berechnen Sie diese Summe genau und beweisen Sie Ihr Ergebnis per Induktion! ⇒ Der Rohe-Gewalt-Alg. läuft in O (n3 ) ∩ Ω (n3 ) = Θ (n3 ) Zeit. Can we do better? Eine schnellere Lösung Problem: Gegeben: Folge A[1..n] von ganzen Zahlen Gesucht: Paar (i , j ) mit 1 ≤ i ≤ j ≤ n, Pj so dass Sij = k =i A[k ] maximal. Idee: Für i = 1, . . . , n berechne Sii , Si ,i +1 , Si ,i +2 , Si ,i +3 , . . . , Si ,n = + + ... + + Wie? A[i ] A[i + 1] A[i + 2] A[i + 3] | {z A[n] } n − i Additionen Insgesamt n X i =1 n−i = 0 X j =n−1 j = n−1 X j =1 j ∈ Θ (n2 ) Add. Eine noch schnellere Lösung? Idee: Drei Möglichkeiten, wo maximale Teilsumme liegt: links der Mitte rechts der Mitte die Mitte enthaltend Nimm Entwurfstechnik Teile & Herrsche! in zwei ungefähr gleichgroße Hälften – teile: durch rekursive Aufrufe für li. u. re. Hälfte – herrsche: – kombiniere: kontrolliere alle Teilsummen, die die Mitte enthalten Davon gibt’s n 2 · n 2 ∈ Θ (n2 ) Einsicht: Wenn die maximale Teilsumme die Mitte enthält, dann muss ihr linker Teil (bis zur Mitte) maximal sein und dann muss ihr rechter Teil (ab der Mitte) maximal sein. ⇒ Wir können li. u. re. Teil unabhängig von einander berechnen! Teile & Herrsche MaxTeilfeld(A, beginn = 1, ende = A.leng th) if beginn == ende then return (beginn, ende, A[beginn]) herrsche (in kleinen Teilinstanzen) else mitte = b(beginn + ende)/2c teile herrsche (L-beginn, L-ende, L-summe) = MaxTeilfeld(A, beginn, mitte) (R-beginn, R-ende, R-summe) = MaxTeilfeld(A, mitte + 1, ende) (M-beginn, M-ende, M-summe)= MaxMittleresTeilfeld(A, beginn, mitte, ende) return (Tripel mit größter Summe) kombiniere Laufzeit: für n > 1: TMT (1) = Θ (1) TMT (n) = TMT (bn/2c) + TMT (dn/2e) + TMMT (n) ≈ 2 · TMT (n/2) + TMMT (n) TMMT (n) = ? Kombiniere MaxMittleresTeilfeld(A, beginn, mitte, ende) L-summe = −∞ Korrektheit? summe = 0 for i = mitte downto beginn do Schleifeninvariante: summe = Si ,mitte und summe = summe + A[i ] L-summe = if summe > L-summe then maxi ≤k ≤mitte Sk ,mitte L-summe = summe L-max = i Laufzeit? :=hier Anz. Additionen R-summe = −∞ mitte − beginn + 1 summe = 0 ende − mitte for i = mitte + 1 to ende do ende − beginn + 1 // analog zu oben + X X =n return (L-max , R-max , L-summe + R-summe) Putting Things Together Laufzeit von MaxTeilfeld: TMT (1) = Θ (1) für n > 1: TMT (n) ≈ 2 · TMT (n/2) + TMMT (n) = 2 · TMT (n/2) + n = VMS (n) = O (n log n ) Denkaufgaben: Lösen Sie MaxTeilfeld in O (n) – also in linearer – Zeit! Was hat MaxTeilfeld mit Aktienkursanalyse (vom Anfang der VL) zu tun? Und wenn...? T (n) = 2 · T (n/2) + 4n (und T (1) = Θ (1)) Gilt dann auch T (n) = O (n log n) ?