Algorithmen und Datenstrukturen

Werbung
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)
?
Herunterladen