07 Advanced Designs
07 Advanced Designs
vi
visual inference
07
Fortgeschrittene
Algorithmen-Entwurfsmethoden
Folien beruhen auf der Veranstaltung von Prof. Marc Fischlin und Christian Janson aus dem SS 2024
(Quicksort, Mergesort)
Dynamisches Greedy
Programmieren
Löse rekursiv baue Lösung aus Folge
(überlappende) Teilprobleme lokal bester Auswahlen zusammen
durch Wiederverwenden
(Kruskal, Prim, Dijkstra)
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 2
vi
Divide & Conquer
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 3
vi
Idee der Fourier-Transformation Beispiel:
Polynommultiplikation
Beispiel:
Beispiel: FFT und inverse FFT Beispiel:
𝑇 = Ω(𝑛! ) in Zeit 𝑂(𝑛 log 𝑛) in Zeit 𝑂(𝑛)
per Divide & Conquer
Transformiere
Lösung in in Zeit ≪ 𝑇 zurück Lösung in
Darstellung X Darstellung Y
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 4
vi
Bilder erstellt mit [Link]
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 5
vi
Bilder erstellt mit [Link]
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 6
vi
Bilder erstellt mit [Link]
„Transformiere in
geeignetere Darstellung,
! ! ! " ' # !
"##$ %&"#$ %!($ %&$)' rechne dort
und transformiere zurück“
in Zeit Θ 𝑛 log 𝑛
𝑟 𝑥 = 𝑝 𝑥 : 𝑞(𝑥) per IFFT 𝑟 𝑥 = 𝑝 𝑥 : 𝑞(𝑥)
vom Grad 2𝑛 − 2 vom Grad 2𝑛 − 2
in Koeffizientendarstellung IDFT in Punkt/Wert-Darstellung
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 7
vi
Bilder erstellt mit [Link]
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 8
vi
Exkurs
Jedes Polynom 𝑝(𝑥) über Körper vom Grad ≤ 𝑛 − 1 lässt sich eindeutig
durch 𝑛 Punkt/Wert-Paare (𝑥* , 𝑦* )*(!,…,$%" für verschiedene 𝑥* durch
𝑦* = 𝑝 𝑥* beschreiben.
In Matrixform:
⋯ 𝑥'"#$ 𝑝' 𝑦' Vandermonde-Matrix 𝑉 𝑥' , … , 𝑥"#$ mit
1 𝑥'
1 𝑥$ 𝑝$ 𝑦$ det 𝑉 𝑥' , … , 𝑥"#$ = ∏'+,-(+"#$(𝑥( − 𝑥, )
⋯ 𝑥$"#$
⋮ = ⋮
⋮ ⋱
1 𝑥"#$ "#$
⋯ 𝑥"#$ 𝑝"#$ 𝑦"#$ det 𝑉 𝑥' , … , 𝑥"#$ ≠ 0 für verschiedene 𝑥( ,
also eindeutige Lösung 𝑝' , 𝑝$ , … , 𝑝"#$
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 9
vi
Bilder erstellt mit [Link]
benötigen 2𝑛 − 1 Paare
(damit auch schon für 𝑝, 𝑞,
da 𝑟 vom Grad 2𝑛 − 2)
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 10
vi
Bilder erstellt mit [Link]
PolyMult(p,q,n)
// p,q arrays of 2n-1 entries x,y
// p[i].x=q[i].x for all i
1 r=ALLOC(2n-1);
2 FOR i=0 TO 2n-2 DO
3 r[i].x = p[i].x;
4 r[i].y = p[i].y * q[i].y;
5 return r;
Laufzeit Θ(𝑛)
$
𝑟 𝑥 = %&&&&&&𝑥 6 +…
IFFT
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 11
vi
Bilder erstellt mit [Link]
! ! ! " ' # !
"##$ %&"#$ %!($ %&$)'
Problem:
Wir benötigen 2𝑛 − 1 Punkt/Werte-Paare
! ! ! " ' # !
"##$ %&"#$ %!($ %&$)'
𝑝 𝑥 = 𝑝787" 𝑥 ! + 𝑥 : 𝑝9:: (𝑥 ! )
! ! ! " ' # !
"##$ %&"#$ %!($ %&$)'
Wir benötigen, dass 𝑛 Zweierpotenz ist; erreichen wir notfalls, indem wir
𝑛 maximal verdoppeln und die zusätzlichen Einträge im Array p[] auf 0 setzen
(Übergang 𝑛 → 2𝑛 wird später in der asymptotischen Laufzeit nicht ins Gewicht fallen)
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 16
vi
FFT - Algorithmen (II)
FFT(p,n,w) // n=2^k =#entries in p, k>=0
1 pEven=ALLOC(n/2); pOdd=ALLOC(n/2);
2 pVal=ALLOC(2n); pEvenVal=ALLOC(n); pOddVal=ALLOC(n);
3 x=ALLOC(2n); x[0]=1; //input values 𝒙𝒋
4 FOR j=1 TO 2n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 17
vi
𝑝 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
FFT - Beispiel (I) p=[5,1,-1,2], n=4, w=𝝎𝟖
FFT([5,1,-1,2],4,𝝎𝟖 )
x[]=[𝟏, 𝝎𝟖 , 𝝎𝟐𝟖 , 𝝎𝟑𝟖 , 𝝎𝟒𝟖 , 𝝎𝟓𝟖 , 𝝎𝟔𝟖 , 𝝎𝟕𝟖 ]
Basisfall für
pEvenVal[] 𝑛=1
FFT([5,-1],2,𝝎𝟐𝟖 ) (konstantes
Polynom)
𝟐 𝟒 𝟔
x[]=[𝟏,
FFT(p,n,w) // n=2^k 𝝎 𝟖 , 𝝎𝟖 ,𝝎𝟖 ] in p, k>=0
=#entries
… pEvenVal[]
4 IF n==1 THEN //constant polynom
𝟒
5 FFT([5],1,𝝎
pVal[0].x=x[0]; 𝟖)
pVal[0].y=p[0].y;
6 pVal[1].x=x[1];return
pVal[1].y=p[0].y;
[(1,5),(𝝎𝟒𝟖 ,5)]
7 ELSE
8 FOR j=0 TO (n-2)/2 DO //create 𝒑𝒆𝒗𝒆𝒏,𝒑𝒐𝒅𝒅
9 pEven[j]=p[2j]; pOdd[j]=p[2j+1];
10 pEvenVal=FFT(pEven,n/2,w*w); //evaluate at 𝒙𝟐𝒋
11 pOddVal =FFT(pOdd,n/2,w*w);
12 FOR j=0 TO 2n-1 DO //𝒑 𝒙𝒋 = 𝒑𝒆𝒗𝒆𝒏 𝒙𝟐𝒋 + 𝒙𝒋 + 𝒑𝒐𝒅𝒅 𝒙𝟐𝒋
13 pVal[j].x=x[j];
14 pVal[j].y=pEvenVal[j mod n].y + x[j]*pOddVal[j mod n].y;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 18
vi
𝑝 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
FFT - Beispiel (II) p=[5,1,-1,2], n=4, w=𝜔6
FFT([5,1,-1,2],4,𝝎𝟖 )
x[]=[𝟏, 𝝎𝟖 , 𝝎𝟐𝟖 , 𝝎𝟑𝟖 , 𝝎𝟒𝟖 , 𝝎𝟓𝟖 𝝎𝟔𝟖 , 𝝎𝟕𝟖 ]
pEvenVal[]
FFT([5,-1],2,𝝎𝟐𝟖 )
𝟐 𝟒 𝟔
x[]=[𝟏,
FFT(p,n,w) // n=2^k 𝝎 𝟖 , 𝝎𝟖 ,𝝎𝟖 ] in p, k>=0
=#entries
… pEvenVal[]=[(1,5),(𝝎𝟒𝟖 ,5)]
4 IF n==1 THEN //constant polynom
5 pOddVal[]pVal[0].y=p[0].y;
pVal[0].x=x[0];
6 pVal[1].x=x[1]; pVal[1].y=p[0].y;
𝟒
7 ELSE
FFT([-1],1,𝝎 𝟖)
8 return
FOR j=0 TO (n-2)/2 DO //create 𝒑𝒆𝒗𝒆𝒏𝟒𝟖,𝒑
[(1,-1),(𝝎 ,-1)]
𝒐𝒅𝒅
9 pEven[j]=p[2j]; pOdd[j]=p[2j+1];
10 pEvenVal=FFT(pEven,n/2,w*w); //evaluate at 𝒙𝟐𝒋
11 pOddVal =FFT(pOdd,n/2,w*w);
12 FOR j=0 TO 2n-1 DO //𝒑 𝒙𝒋 = 𝒑𝒆𝒗𝒆𝒏 𝒙𝟐𝒋 + 𝒙𝒋 + 𝒑𝒐𝒅𝒅 𝒙𝟐𝒋
13 pVal[j].x=x[j];
14 pVal[j].y=pEvenVal[j mod n].y + x[j]*pOddVal[j mod n].y;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 19
vi
𝑝 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
FFT - Beispiel (III) p=[5,1,-1,2], n=4, w=𝜔6
FFT([5,1,-1,2],4,𝝎𝟖 )
x[]=[𝟏, 𝝎𝟖 , 𝝎𝟐𝟖 , 𝝎𝟑𝟖 , 𝝎𝟒𝟖 , 𝝎𝟓𝟖 𝝎𝟔𝟖 , 𝝎𝟕𝟖 ]
5 + 1 + (−1)
pEvenVal[]
FFT([5,-1],2,𝝎𝟐𝟖 ) 5 + 𝜔+, + (−1)
𝟐 𝟒 𝟔
x[]=[𝟏,
FFT(p,n,w) // n=2^k 𝝎𝟖 , 𝝎𝟖 ,𝝎𝟖 ] in p, k>=0
=#entries 5 + 𝜔+- + (−1)
… pEvenVal[]=[(1,5),(𝝎𝟒𝟖 ,5)]
4 IF n==1 THEN //constant polynom 5 + 𝜔+. + (−1)
𝟒
5 pOddVal[]=[(1,-1),(𝝎
pVal[0].x=x[0]; pVal[0].y=p[0].y; 𝟖 ,-1)]
6 pVal[1].x=x[1]; pVal[1].y=p[0].y;
pVal[]=[(1,4),(𝜔6! ,5-𝜔6! ),
7 ELSE H H J J
8 (𝜔 ,5-𝜔 ),(𝜔 ,5-𝜔
FOR j=0 TO (n-2)/2 DO //create 𝒑𝒆𝒗𝒆𝒏,𝒑𝒐𝒅𝒅
6 6 6 6 )]
9 pEven[j]=p[2j]; pOdd[j]=p[2j+1];
10 pEvenVal=FFT(pEven,n/2,w*w); //evaluate at 𝒙𝟐𝒋
11 pOddVal =FFT(pOdd,n/2,w*w);
12 FOR j=0 TO 2n-1 DO //𝒑 𝒙𝒋 = 𝒑𝒆𝒗𝒆𝒏 𝒙𝟐𝒋 + 𝒙𝒋 + 𝒑𝒐𝒅𝒅 𝒙𝟐𝒋
13 pVal[j].x=x[j];
14 pVal[j].y=pEvenVal[j mod n].y + x[j]*pOddVal[j mod n].y;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 20
vi
𝑝 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
FFT - Beispiel (IV) p=[5,1,-1,2], n=4, w=𝜔6
FFT([5,1,-1,2],4,𝝎𝟖 )
x[]=[𝟏, 𝝎𝟖 , 𝝎𝟐𝟖 , 𝝎𝟑𝟖 , 𝝎𝟒𝟖 , 𝝎𝟓𝟖 𝝎𝟔𝟖 , 𝝎𝟕𝟖 ]
pEvenVal[]=[(1,4),(𝜔6! ,5-𝜔6! ),(𝜔6H ,5-𝜔6H ),(𝜔6J ,5-𝜔6J )]
pOddVal[]=[(1,3),(𝜔6! ,1+2𝜔6! ),(𝜔6H ,1+2𝜔6H ),(𝜔6J ,1+2𝜔6J )]
$ ! $ !
pVal=[(1,4+1:3),(𝜔
FFT(p,n,w) 6 ,(5-𝜔6in
// n=2^k =#entries )+𝜔p, k>=0 6 )),
6 :(1+2𝜔
… (𝜔6! ,(5-𝜔6H )+𝜔6! :(1+2𝜔6H ),…]
4 IF n==1 THEN //constant polynom
5 7 = 𝑝(1)
pVal[0].x=x[0]; + 𝜔6$ − 𝜔6! + 2𝜔6> = 𝑝(𝜔6$ )
5pVal[0].y=p[0].y;
6 pVal[1].x=x[1]; pVal[1].y=p[0].y;
7 ELSE 5 + 𝜔6! − 𝜔6H + 2𝜔6J = 𝑝(𝜔6! )
8 FOR j=0 TO (n-2)/2 DO //create 𝒑𝒆𝒗𝒆𝒏,𝒑𝒐𝒅𝒅
return pVal[]
9 pEven[j]=p[2j]; pOdd[j]=p[2j+1];
10 pEvenVal=FFT(pEven,n/2,w*w); //evaluate at 𝒙𝟐𝒋
11 pOddVal =FFT(pOdd,n/2,w*w);
12 FOR j=0 TO 2n-1 DO //𝒑 𝒙𝒋 = 𝒑𝒆𝒗𝒆𝒏 𝒙𝟐𝒋 + 𝒙𝒋 + 𝒑𝒐𝒅𝒅 𝒙𝟐𝒋
13 pVal[j].x=x[j];
14 pVal[j].y=pEvenVal[j mod n].y + x[j]*pOddVal[j mod n].y;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 21
vi
FFT - Laufzeit Laufzeit Θ(𝑛 log 𝑛)
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 22
vi
Die Diskrete Fourier-Transformation wird abstrakt definiert durch:
𝑎! 𝑎@!
𝑎" DFT 𝑎@" $%"
*)
⋮ ⋮ mit 𝑎@* = D 𝑎) * 𝜔$
)(!
𝑎$%" 𝑎@$%"
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 23
vi
Inverse DFT berechnen (I)
Zur Erinnerung:
𝑟 = 𝑝𝑞 Polynom vom Grad 𝑚 ≤ 2𝑛 − 1
1 𝑥' ⋯ 𝑥'F#$ 𝑟' 𝑦'
(
1 𝑥$ ⋯ 𝑥$F#$ 𝑟$ 𝑦$ 𝑥( = 𝜔F 𝑗-te Potenz der 𝑚-ten
⋮ = ⋮
⋮ ⋱ primitiven Einheitswurzel 𝜔F
1 𝑥F#$ F#$
⋯ 𝑥F#$ 𝑟F#$ 𝑦F#$
Vandermonde-Matrix 𝑉 = 𝑉 𝑥' , … , 𝑥F#$
(%
(𝑉)(% = 𝜔F
= 𝑉 %!
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 24
vi
Inverse DFT berechnen (II)
.123
Es gilt: 𝑉 %" = - *)
, denn:
1
⋯ %
𝜔F
1 #( #!( # F#$ ( !%
𝑉 #$ : 𝑉 = : 1 𝜔F 𝜔F ⋯ 𝜔F : ⋮ 𝜔F ⋮
𝑚 ⋮
⋯
𝜔FF#$ %
F#$ F#$
1 '
1
: 9 𝜔F = : 9 1 = 1 für 𝑗 = 𝑘
F#$ 𝑚 𝑚
1 O #(E% O&' O&'
= : 9 𝜔F =
𝑚 F #(E%
O&' (% 1 𝜔F −1 1 1−1
: = : #(E% =0
𝑚 𝜔 #(E% − 1 𝑚 𝜔 −1
F F
für 𝑗 ≠ 𝑘,
" 8!": 0 ≤ 𝑗, 𝑘 < 𝑚
verwendet ∑789 4 ! #$
456 𝑞 = !#$ für 𝑞 ≠ 1, hier 𝑞 = 𝜔7 ≠ 1 für 𝑗 ≠ 𝑘
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 25
vi
Inverse DFT berechnen (III) rechne Faktor
IFFTWrap(rVal,n) // n=2^k =#entries in rVal, k>=0 1/n heraus
//w n-th primitive root of unity
1 r[]=IFFT(rVal,n,w);
2 FOR j=0 TO n-1 DO r[j]=r[j]/n;
3 return r; Laufzeit Θ(𝑛 log 𝑛)
IFFT(rVal,n,w) // n=2^k =#entries in rVal, k>=0
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
2 x=ALLOC(n); x[0]=1;
3 FOR j=1 TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
4 IF n==1 THEN
5 r[0]=rVal[0].y;
6 ELSE Division, da wir inverses
8;!
7 rEven=ALLOC(n/2); rOdd=ALLOC(n/2); 𝜔# benötigen
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
14 return r;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 26
vi
Inverse FFT: Beispiel (I) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]
𝜔H = 𝑖 6−𝑖
IFFT([(1,7),(𝝎𝟐𝟒 ,1)],2,𝝎𝟐𝟒 )
𝜔H! = −1 1
𝟐
x[]=[𝟏,
IFFT(rVal,n,w) 𝟒]
//𝝎n=2^k =#entries in rVal, k>=0
𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
2 rEven[]
x=ALLOC(n); x[0]=1;
3 FOR j=1 TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
IFFT([(1,7)],1,𝟏)
4 IF n==1 THEN
5 return [7]
r[0]=rVal[0].y;
6 ELSE
7 rEven=ALLOC(n/2); rOdd=ALLOC(n/2);
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 27
vi
Inverse FFT: Beispiel (II) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]
𝜔H = 𝑖 6−𝑖
IFFT([(1,7),(𝝎𝟐𝟒 ,1)],2,𝝎𝟐𝟒 )
𝜔H! = −1 1
𝟐
x[]=[𝟏,
IFFT(rVal,n,w) 𝟒]
//𝝎n=2^k =#entries in rVal, k>=0
𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
2 rEven[]=[7]
x=ALLOC(n); x[0]=1;
3 FOR j=1rOdd[]
TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
4 IF n==1 THEN
5 IFFT([𝝎𝟐𝟒 ,1)],1,𝟏)
r[0]=rVal[0].y;
6 ELSE return [1]
7 rEven=ALLOC(n/2); rOdd=ALLOC(n/2);
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 28
vi
Inverse FFT: Beispiel (III) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]
𝜔H = 𝑖 6−𝑖
IFFT([(1,7),(𝝎𝟐𝟒 ,1)],2,𝝎𝟐𝟒 )
𝜔H! = −1 1
𝟐
x[]=[𝟏,
IFFT(rVal,n,w) 𝟒]
//𝝎n=2^k =#entries in rVal, k>=0
𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
2 rEven[]=[7]
x=ALLOC(n); x[0]=1;
3 FOR j=1rOdd[]=[1]
TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
4 IF n==1 THEN
r[]=[7+1/1,7+1/-1]=[8,6]
5 r[0]=rVal[0].y;
6 ELSE return r[]
7 rEven=ALLOC(n/2); rOdd=ALLOC(n/2);
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 29
vi
Inverse FFT: Beispiel (IV) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]=[8,6]
𝜔H = 𝑖 6−𝑖
rOdd[]
𝜔H! = −1 1
𝟑 𝟐
IFFT([(𝝎//
IFFT(rVal,n,w) 𝟒 ,6-i),(𝝎 𝟒 ,6+i)],2,𝝎
n=2^k =#entries 𝟒)
in rVal, k>=0
𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
x[]=[𝟏, 𝝎𝟐𝟒 ]
2 x=ALLOC(n); x[0]=1;
3 FOR j=1rEven[]
TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
4 IF n==1 THEN
IFFT([(𝝎𝟒 ,6-i)],1,𝟏)
5 r[0]=rVal[0].y;
6 ELSE return [6-i]
7 rEven=ALLOC(n/2); rOdd=ALLOC(n/2);
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 30
vi
Inverse FFT: Beispiel (V) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]=[8,6]
𝜔H = 𝑖 6−𝑖
rOdd[]
𝜔H! = −1 1
𝟑 𝟐
IFFT([(𝝎//
IFFT(rVal,n,w) 𝟒 ,6-i),(𝝎 𝟒 ,6+i)],2,𝝎
n=2^k =#entries 𝟒)
in rVal, k>=0
𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
x[]=[𝟏, 𝝎𝟐𝟒 ]
2 x=ALLOC(n); x[0]=1;
3 FOR j=1rEven[]=[6-i]
TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
4 IF n==1rOdd[]
THEN
5 r[0]=rVal[0].y;
6 ELSE IFFT([(𝝎𝟑𝟒 ,6+i)],1,𝟏)
7 rEven=ALLOC(n/2);
returnrOdd=ALLOC(n/2);
[6+i]
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 31
vi
Inverse FFT: Beispiel (VI) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]=[8,6]
𝜔H = 𝑖 6−𝑖
rOdd[]
𝜔H! = −1 1
𝟑 𝟐
IFFT([(𝝎//
IFFT(rVal,n,w) 𝟒 ,6-i),(𝝎 𝟒 ,6+i)],2,𝝎
n=2^k =#entries 𝟒)
in rVal, k>=0
𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
x[]=[𝟏, 𝝎𝟐𝟒 ]
2 x=ALLOC(n); x[0]=1;
3 FOR j=1rEven[]=[6-i]
TO n-1 DO x[j]=w*x[j-1]; //x[j]= w^j
4 IF n==1rOdd[]=[6+i]
THEN
5 r[0]=rVal[0].y;
6 ELSE r[]=[12,-2i]
7 rEven=ALLOC(n/2);
return r[] rOdd=ALLOC(n/2);
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 32
vi
Inverse FFT: Beispiel (VII) 𝑟 𝑥 = 5 + 𝑥 − 𝑥 ! + 2𝑥 >
𝜔H = 𝑖
IFFT([(1,7),(𝝎𝟒 ,6-i),(𝝎𝟐𝟒 ,1),(𝝎𝟑𝟒 ,6+i)],4,𝝎𝟒 )
𝒙 𝒓(𝒙)
x[]=[𝟏, 𝝎𝟒 , 𝝎𝟐𝟒 , 𝝎𝟑𝟒 ]
1 7
rEven[]=[8,6]
𝜔H = 𝑖 6−𝑖
rOdd[]=[12,-2i]
𝜔H! = −1 1
r[0]=8+12/1=20
IFFT(rVal,n,w) // n=2^k =#entries in rVal, k>=0
Alle Werte werden in 𝜔H> = −𝑖 6+𝑖
1 r=ALLOC(n); rEvenVal=ALLOC(n); rOddVal=ALLOC(n);
r[1]=6-2i/i=4 IFFTWrap noch durch
2 x=ALLOC(n); x[0]=1;
3r[2]=8+12/-1=-4 𝑛 = 4 dividiert und
FOR j=1 TO n-1 DO x[j]=w*x[j-1]; ergeben
//x[j]= w^j
4 IF n==1 THEN daher Koeffizienten von 𝑟(𝑥)
5r[3]=6-2i/-i=8
r[0]=rVal[0].y;
6return
ELSE r[]=[20,4,-4,8]
7 rEven=ALLOC(n/2); rOdd=ALLOC(n/2);
8 FOR j=0 TO (n-2)/2 DO
9 rEvenVal[j]=rVal[2j]; rOddVal[j]=rVal[2j+1];
10 rEven=IFFT(rEvenVal,n/2,w*w);
11 rOdd =IFFT(rOddVal,n/2,w*w);
12 FOR j=0 TO n-1 DO
13 r[j]=rEven[j mod n/2] + rOdd[j mod n/2]/x[j];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 33
vi
Bilder erstellt mit [Link]
Fourier-Transformation, woanders
Q
P& !"GR !"GR
𝑓: ℝ → ℝ mit Periode 𝑇 𝑓 𝑡 = !
+9 (𝑎" : cos S
+ 𝑏" : sin S
)
"&$
Beispielanwendung: Frequenz-Filter
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 34
vi
Backtracking
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 35
vi
Backtracking
Prinzip Backtracking:
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 36
vi
Beispiel: 4x4-Sudoku (I)
4
in jeder Zeile die Ziffern 1,2,3,4
2
in jeder Spalte die Ziffern 1,2,3,4
4 3 1
in jedem Quadranten die Ziffern 1,2,3,4
3
4 1
2
zwei Möglichkeiten: 1 und 2
4 3 1
4 1
4 1 3
4 3 1 ® Backtracking
4 2 1 3
einzig zulässige Option
2
4 3 1
4 2 1 3
zwei Möglichkeiten: 1 und 3
1 2
4 2 1 3
3 1 4 2
1 3 2 4
3 1 4 2
2 4 3 1
1 3 2 4
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 44
vi
Backtracking vs. Brute-Force Search
4 2 1 3
3 1 4 2
2 4 3 1
1 3 2 4
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
…
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
… 3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1
3
2
1
4
4
3
2
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 45
vi
Backtracking: Lösungssuche
4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3
3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2
2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1 2 4 3 1
1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4 1 3 2 4
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 46
vi
Beispiel: Regulärer Ausdruck (I) Mustersuche in Strings
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 47
vi
Beispiel: Regulärer Ausdruck (II) a(b|c)+d
abacd
abacd abacd
keine Option
a(b|c)+d
Back-
tracking Lösung!
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 48
vi
Aufwand Backtracking
Evtl. exponentieller Aufwand kann exponentiell werden
Schlechte, verschachtelte
regulärer Ausdruck: ^(a+)+$ Formulierung für:
„Zeile enthält nur a‘s“
aaaa…aaaab
expontielle Anzahl
von Möglichkeiten
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 49
vi
Dynamische Programmierung
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 50
vi
Dynamisches Programmieren
Rekonstruiere Gesamtlösung
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 51
vi
Beispiel: Fibonacci-Zahlen
Fib-Rek(n) // n>=1
1 IF n<=2 THEN
2 return 1;
3 ELSE
4 return Fib-Rek(n-1)+Fib-Rek(n-2);
𝑇 𝑛 =𝑇 𝑛−1 +𝑇 𝑛−2 +𝑐
≈2:𝑇 𝑛−1 +𝑐
=4:𝑇 𝑛−2 +2:𝑐+𝑐
= …
= Θ(2" )
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 52
vi
Fibonacci-Berechnungsbaum
𝐹s
viele Werte
𝐹t 𝐹u werden mehrfach
berechnet
𝐹u 𝐹v 𝐹v 𝐹n
Ansatz:
𝐹v 𝐹n 𝐹n 𝐹m 𝐹n 𝐹m speichere stattdessen
Werte zwischen
(„Memoization“)
𝐹n 𝐹m
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 53
vi
Fibonacci mit Memoization Laufzeit Θ(𝑛)
𝐹s
Wenn Basisfall erreicht,
nur noch Addieren und Auslesen
𝐹t aus Speicher 𝐹u
FibDyn(n) // n>=1
1 F[]=ALLOC(n); //F_i at F[i-1]
𝐹u 𝐹v 2 FOR i=0 TO n-1 DO F[i]=0;
aus Speicher 3 return FibDynRek(n-1,F);
FibDynRek(i,F) // i>=0
𝐹v 𝐹n 1 IF F[i]!=0 THEN return F[i];
aus Speicher 2 IF i<=1 THEN schon berechnet,
3 f=1 dann zurückgeben
𝐹n 𝐹m 4 ELSE
5 f=FibDynRek(i-1,F)+FibDynRek(i-2,F);
6 F[i]=f;
7 return f;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 54
vi
Minimum Edit Distance (I) (Levenshtein-Distanz)
Levenshtein-Distanz=5
e i n T e s t
(manchmal Kosten 2 für
Substitution, dann Distanz hier 6)
z w e i F e s t e
i i c c d c s c c c i c für copy(S,i)-ohne Kosten
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 55
vi
Minimum Edit Distance (II)
beginnen hier jeweils bei 1
Algorithmische Sichtweise:
Überführe schrittweise String X[1…m] von links nach rechts in String Y[1…n]
X[1…4] X[5]
e i n T e s t Achtung:
Optimalität dieser
Herangehensweise
wäre zu zeigen
z w e i F e s t e
Y[1…5] Y[6]
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 56
vi
Minimum Edit Distance (III)
D[i][j] sei Distanz, um X[1…i] in Y[1…j] zu überführen (i,j>=1)
a b b
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 57
vi
Minimum Edit Distance (IV)
D[i][j] sei Distanz, um X[1…i] in Y[1…j] zu überführen (i,j>=1)
a b b
a b b
D[i][j]
=
D[i][j] D[i][j] D[i][j] D[i][j] D[i][j]
min
= = = = =
{ D[i-1][j-1]+(X[i]!=Y[j])
D[i-1][j-1] ,
D[i-1][j-1]+1 D[i-1][j]+1, D[i][j-1]+1 }
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 59
vi
Minimum Edit Distance (V)
D[i][j] sei Distanz, um X[1…i] in Y[1…j] zu überführen (i,j>=1)
„Randbedingungen“:
D[i][j]
=
D[i][j] D[i][j] D[i][j] D[i][j] D[i][j]
min
= = = = =
{ D[i-1][j-1]+(X[i]!=Y[j])
D[i-1][j-1] ,
D[i-1][j-1]+1 D[i-1][j]+1, D[i][j-1]+1 }
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 60
vi
Minimum Edit Distance: Algorithmus
mittels dynamischer Programmierung und Memoization
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 61
vi
Minimum Edit Distance: Beispiel (I)
X[1…i]
D 0 1 2 3 4 5 6 7 8
X[1… 8] = ein Test 0 0 1 2 3 4 5 6 7 8
1
Y[1…10] = zwei Feste 1
2 2
3 3
Y[1…j]
Initialisierung (2 und 3) 4 4
5 5
6 6
7 7
MinEditDist(X,Y,m,n) // X=X[1…m], Y=Y[1…n]
8 8
1 D[][]=ALLOC(m,n);
9 9
2 FOR i=0 TO m DO D[i][0]=i;
10 10
3 FOR j=0 TO n DO D[0][j]=j;
4 FOR i=1 TO m DO
5 FOR j=1 TO n DO
6 IF X[i]=Y[j] THEN s=0 ELSE s=1;
7 D[i][j]=min{D[i-1][j-1]+s,D[i-1][j]+1,D[i][j-1]+1};
8 return D[m][n];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 62
vi
Minimum Edit Distance: Beispiel (II)
X[1…i]
D 0 1 2 3 4 5 6 7 8
X[1… 8] = ein Test 0 0 1 2 3 4 5 6 7 8
1
Y[1…10] = zwei Feste 1 1
2 2
3 3
i=1: FOR-Schleife für j (5-7)
Y[1…j]
4 4
j=1: X[1]=e ≠ z=Y[1] ⟹ s=1 5 5
D[1][1]=min{0+1,1+1,1+1}=1 6 6
7 7
MinEditDist(X,Y,m,n) // X=X[1…m], Y=Y[1…n]
8 8
1 D[][]=ALLOC(m,n);
9 9
2 FOR i=0 TO m DO D[i][0]=i;
10 10
3 FOR j=0 TO n DO D[0][j]=j;
4 FOR i=1 TO m DO
5 FOR j=1 TO n DO
6 IF X[i]=Y[j] THEN s=0 ELSE s=1;
7 D[i][j]=min{D[i-1][j-1]+s,D[i-1][j]+1,D[i][j-1]+1};
8 return D[m][n];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 63
vi
Minimum Edit Distance: Beispiel (III)
X[1…i]
D 0 1 2 3 4 5 6 7 8
X[1… 8] = ein Test 0 0 1 2 3 4 5 6 7 8
1 1
Y[1…10] = zwei Feste 1
2 2 2
3 3
i=1: FOR-Schleife für j (5-7)
Y[1…j]
4 4
j=2: X[1]=e ≠ w=Y[2] ⟹ s=1 5 5
D[1][2]=min{1+1,2+1,1+1}=2 6 6
7 7
MinEditDist(X,Y,m,n) // X=X[1…m], Y=Y[1…n]
8 8
1 D[][]=ALLOC(m,n);
9 9
2 FOR i=0 TO m DO D[i][0]=i;
10 10
3 FOR j=0 TO n DO D[0][j]=j;
4 FOR i=1 TO m DO
5 FOR j=1 TO n DO
6 IF X[i]=Y[j] THEN s=0 ELSE s=1;
7 D[i][j]=min{D[i-1][j-1]+s,D[i-1][j]+1,D[i][j-1]+1};
8 return D[m][n];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 64
vi
Minimum Edit Distance: Beispiel (IV)
X[1…i]
D 0 1 2 3 4 5 6 7 8
X[1… 8] = ein Test 0 0 1 2 3 4 5 6 7 8
1 1
Y[1…10] = zwei Feste 1
2 2 2
3 3 2
i=1: FOR-Schleife für j (5-7)
Y[1…j]
4 4
j=3: X[1]=e = e=Y[3] ⟹ s=0 5 5
D[1][3]=min{2+0,3+1,2+1}=2 6 6
7 7
MinEditDist(X,Y,m,n) // X=X[1…m], Y=Y[1…n]
8 8
1 D[][]=ALLOC(m,n);
9 9
2 FOR i=0 TO m DO D[i][0]=i;
10 10
3 FOR j=0 TO n DO D[0][j]=j;
4 FOR i=1 TO m DO
5 FOR j=1 TO n DO
6 IF X[i]=Y[j] THEN s=0 ELSE s=1;
7 D[i][j]=min{D[i-1][j-1]+s,D[i-1][j]+1,D[i][j-1]+1};
8 return D[m][n];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 65
vi
Minimum Edit Distance: Beispiel (V)
X[1…i]
D 0 1 2 3 4 5 6 7 8
X[1… 8] = ein Test 0 0 1 2 3 4 5 6 7 8
1 1 2
Y[1…10] = zwei Feste 1
2 2 2 2
3 3 2 3
i=2: FOR-Schleife für j (5-7)
Y[1…j]
4 4 3 2
j=4: X[2]=i = i=Y[4] ⟹ s=0 5 5 4
D[2][4]=min{2+0,3+1,3+1}=2 6 6 5
7 7 6
MinEditDist(X,Y,m,n) // X=X[1…m], Y=Y[1…n]
8 8 7
1 D[][]=ALLOC(m,n);
9 9 8
2 FOR i=0 TO m DO D[i][0]=i;
10 10 9
3 FOR j=0 TO n DO D[0][j]=j;
4 FOR i=1 TO m DO
5 FOR j=1 TO n DO
6 IF X[i]=Y[j] THEN s=0 ELSE s=1;
7 D[i][j]=min{D[i-1][j-1]+s,D[i-1][j]+1,D[i][j-1]+1};
8 return D[m][n];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 66
vi
Minimum Edit Distance: Beispiel (VI)
X[1…i]
D 0 1 2 3 4 5 6 7 8
X[1… 8] = ein Test 0 0 1 2 3 4 5 6 7 8
1 1 2 3 4 5 6 7 8
Y[1…10] = zwei Feste 1
2 2 2 2 3 4 5 6 7 8
3 3 2 3 3 4 5 5 6 7
Y[1…j]
4 4 3 2 3 4 5 6 6 7
5 5 4 3 3 3 4 5 6 7
6 6 5 4 4 4 4 5 6 7
7 7 6 5 5 5 5 4 5 6
MinEditDist(X,Y,m,n) // X=X[1…m], Y=Y[1…n]
8 8 7 6 6 6 6 5 4 5
1 D[][]=ALLOC(m,n);
9 9 8 7 7 7 7 6 5 4
2 FOR i=0 TO m DO D[i][0]=i;
10 10 9 8 8 8 8 7 6 5
3 FOR j=0 TO n DO D[0][j]=j;
4 FOR i=1 TO m DO
5 FOR j=1 TO n DO
6 IF X[i]=Y[j] THEN s=0 ELSE s=1;
7 D[i][j]=min{D[i-1][j-1]+s,D[i-1][j]+1,D[i][j-1]+1};
8 return D[m][n];
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 67
vi
Minimum Edit Distance: Beispiel (VII)
X[1…i]
D 0 1 2 3 4 5 6 7 8
Rückwärtsschrittfolge 0 0 1 2 3 4 5 6 7 8
D[m][n] zu D[0][0] entlang 1 1 1 2 3 4 5 6 7 8
der ausgewählten Minima 2 2 2 2 3 4 5 6 7 8
(bzw. bis Rand erreicht) 3 3 2 3 3 4 5 5 6 7
Y[1…j]
gibt Operationen an: 4 4 3 2 3 4 5 6 6 7
5 5 4 3 3 3 4 5 6 7
6 6 5 4 4 4 4 5 6 7
(↘) : copy (±0) 7 7 6 5 5 5 5 4 5 6
↘ : sub (+1) 8 8 7 6 6 6 6 5 4 5
⟶ : del 9 9 8 7 7 7 7 6 5 4
↓ : ins 10 10 9 8 8 8 8 7 6 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 68
vi
Minimum Edit Distance: Beispiel (VIII)
(↘) c, ↘ s, ⟶ d, X[1…i]
↓i D 0 1 2 3 4 5 6 7 8
ein£Test 0 0 1 2 3 4 5 6 7 8
↓ zein£Test 1 1 1 2 3 4 5 6 7 8
↓ zwein£Test 2 2 2 2 3 4 5 6 7 8
(↘) zwein£Test 3 3 2 3 3 4 5 5 6 7
Y[1…j]
(↘) zwein£Test 4 4 3 2 3 4 5 6 6 7
⟶ zwei£Test 5 5 4 3 3 3 4 5 6 7
(↘) zwei£Test
6 6 5 4 4 4 4 5 6 7
↘ zwei£Fest
7 7 6 5 5 5 5 4 5 6
(↘) zwei£Fest
8 8 7 6 6 6 6 5 4 5
(↘) zwei£Fest
(↘) zwei£Fest 9 9 8 7 7 7 7 6 5 4
↓ zwei£Feste 10 10 9 8 8 8 8 7 6 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 69
vi
Geben Sie zwei Strings an, die durch verschiedene Sequenzen
von Operationen mit gleicher Levenshtein-Distanz ineinander
übergeführt werden können
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 70
vi
Greedy-Algorithmen
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 71
vi
Greedy-Algorithmen
Prinzip Greedy:
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 72
vi
„Unsere“ Greedy-Algorithmen…
(auch Prim)
Dijkstra-SSSP(G,s,w)
1 initSSSP(G,s,w);
2 Q=V; //let S=V-Q wähle jeweils Knoten,
3 WHILE !isEmpty(Q) DO der kürzeste Distanz hat
4 u=EXTRACT-MIN(Q); //wrt. dist
5 FOREACH v in adj(u) DO
6 relax(G,u,v,w);
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 73
vi
…funktionieren oft, aber nicht immer
Dijkstra-SSSP(G,s,w)
1 initSSSP(G,s,w);
2 Q=V; //let S=V-Q
3 WHILE !isEmpty(Q) DO
4 u=EXTRACT-MIN(Q); //wrt. dist
5 FOREACH v in adj(u) DO
6 relax(G,u,v,w);
1
kürzester Weg 1®5 via 2 3
1® 2 ® 4 ® 3 ® 5 6
mit Gewicht 6+2-5+0=3 -5
2
1 4
0
Dijkstra-Algorithmus: 5
1®5 mit Gewicht 5 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 74
vi
Traveling Salesperson Problem (TSP)
Traveling Salesperson Problem:
Gegeben vollständiger (un-)gerichteter Graph 𝐺 = 𝑉, 𝐸 mit Kantenge-
wichten 𝑤: 𝐸 → ℝ, finde Tour 𝑝 mit minimalem Kantengewicht 𝑤(𝑝).
Eine Tour ist ein Weg 𝑝 = (𝑣! , 𝑣" , … , 𝑣$%" , 𝑣$ ) entlang der Kanten
(𝑣' , 𝑣'/" ) ∈ 𝐸 für 𝑖 = 0,1,2, … 𝑛 − 1, der bis auf Start- und Endknoten
𝑣! = 𝑣$ jeden Knoten genau einmal besucht.
1 FOREACH v in V DO [Link]=white;
2 tour[]=ALLOC(n); tour[0]=s; tour[0].color=gray;
3 FOR i=1 TO n-1 DO
4 tour[i]=EXTRACT-MIN(adj(tour[i-1]));
//get (white) neighbor with minimum edge weight
5 tour[i].color=gray;
6 return tour;
1
2 3
2 2
Optimale Tour mit Startknoten 𝑠 = 1 1 1
1®2®… ® 𝑛 − 2 ® 𝑛 ® 𝑛 − 1 ®1 2
1 4
2 2
hat Gewicht
𝑁 5 1
1 + 1 + ⋯+ 1 + 2 + 1 + 2 = 𝑛 + 2
Beispiel: 𝑛 = 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 78
vi
Greedy-TSP ist zu gierig (II)
Betrachte vollständigen Graphen mit Knoten 𝑉 = {1,2,3, … , 𝑛}, 𝑛 ≥ 3,
und folgenden Kantengewichten für beliebig große Konstante 𝑁:
1 1 ≤ 𝑖, 𝑗 ≤ 𝑛, 𝑗 = 𝑖 + 1
𝑤 {𝑖, 𝑗} = 𝑁 𝑖 = 1, 𝑗 = 𝑛 Startknoten 𝑠 = 1
2 𝑠𝑜𝑛𝑠𝑡
1
2 3
Greedy-Algorithmus läuft zunächst 2 2
1 1
1®2®… ® 𝑛 − 1 ® 𝑛,
2
1 4
muss dann die „teure“ Kante 𝑛 ® 1 2 2
nehmen, erreicht also nur Gewicht 𝑁 5 1
1 + 1 + ⋯+ 1 + 𝑁 = 𝑁 + 𝑛 − 1 Beispiel: 𝑛 = 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 79
vi
Effizienter Algorithmus für TSP?
TSP(G,w,s)
???
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 80
vi
Metaheuristiken
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 81
vi
Heuristiken und Metaheuristiken
Heuristik: Metaheuristik:
dedizierter Suchalgorithmus
für Optimierungsproblem, allgemeine Vorgehensweise,
um Suche für beliebige
der gute (aber evtl. nicht optimale) Optimierungsprobleme
Lösung für spezielles Problem findet zu leiten
problem-abhängig, problem-unabhängig,
arbeitet direkt „am“ Problem arbeitet mit abstrakten Problemen
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 82
vi
Lokale Suche
„Hill-Climbing-Strategie“
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 83
vi
Hill-Climbing-Algorithmus
Beispiel TSP:
initSol: wähle beliebige Tour, z.B. per Greedy-Algorithmus
perturb: wähle zwei Knoten u,v zufällig und tausche sie in Tour
quality: (negatives) Gewicht der aktuellen Tour
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 84
vi
Hill-Climbing-Algorithmus für TSP
1 1
2 3 wenn 4,5 2 3
2 2 gewählt 2 2
1 1 1 1
2 2
1 4 1 4
2 2 2 2
𝑁 5 1 𝑁 5 1
Beispiel TSP:
initSol: wähle beliebige Tour, z.B. per Greedy-Algorithmus
perturb: wähle zwei Knoten u,v zufällig und tausche sie in Tour
quality: (negatives) Gewicht der aktuellen Tour
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 85
vi
Lokale vs. globale Maxima
lokales Maximum
Lösungen
2 2 2 2
N N
5 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 87
vi
Lokale vs. globale Maxima beim TSP (II)
Hill-Climbing findet 2 2
keine bessere Lösung in der Nähe N N
® Greedy-Lösung lokales Max (bzw. Min) 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 88
vi
Lokale vs. globale Maxima beim TSP (III)
optimale Lösung 2
1®2®5®3®4®1 mit Gewicht 8 1 1 1
1 2 3 4
2 2
2
5
1 1 1 Tausche
1 2 3 4 3 und 5
N Greedy-Lösung
2 2
N 1®2®3®4®5®1 mit Gewicht 2N+3
5
2
1 1 1
1®2®3®5®4®1 mit Gewicht 2N+4 1 2 3 4
2 2
N N
5
Tausche 4 und 5
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 89
vi
Lokale vs. globale Maxima beim TSP (IV)
Optimale Lösung
1®2®5®3®4®1
Greedy Lösung mit Gewicht 8
1®2®3®4®5®1
mit Gewicht 2N+3
lokaler
Suchbereich
Zwischenlösung
1®2®3®5®4®1
mit Gewicht 2N+4
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 90
vi
Iterative Lokale Suche Problem: „zufällige“ (?) Lösungen
könnten auch schlecht sein
Beginne Suche nochmal von vorne, z.B. mit neuer zufälliger Lösung,
akzeptiere beste gefundene Lösung
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 91
vi
Simulated Annealing
„Annealing“ in Metallverarbeitung:
Härten von Metallen durch Erhitzen auf hohe Temperatur
und langsames Abkühlen
je nach Temperatur
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 92
vi
„In schlechte Richtung“ mit Wahrscheinlichkeit
Ansatz: akzeptiere auch schlechtere Lösung new mit
quality(new)<quality(sol) mit Wahrscheinlichkeit:
𝑒 ˆŠŽ•Š•…ˆ„•Š
Exponent
heiße Temperatur (zu Beginn):
akzeptiere oft viel schlechtere Lösungen
kühlere Temperatur (am Ende):
akzeptiere selbst unwesentlich schlechtere Lösungen fast nie
(am Ende also quasi Hill-Climbing)
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 93
vi
Simulated Annealing
1 sol=initialSol(P);
2 time=0; uniformer Wert
3 WHILE time<maxTime DO zwischen 0 und 1
4 new=perturb(P,sol);
5 temperature=TempSched[time];
6 d=quality(P,new)-quality(P,sol); r=random(0,1);
7 IF d>0 OR r<=exp(d/temperature) THEN
8 sol=new;
9 time=time+1;
10 return sol;
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 94
vi
Simulated Annealing beim TSP
2
Starttemperatur 1 1 1
= max{𝑤 𝑒 } = 𝑁 = 1000 1 2 3 4
0∈2
2 2
lineare Temperaturabnahme = 𝑁/2𝑛 = 100 5
Aktuelle Lösung Gewicht Zuf. Gew. Temp Zuf. Exp Neue Löung
Tausch nach Wert r (-d/temp) akzeptiert?
Tausch
1 1®2®3®4®5®1 2N+3 2 und 3 5N 1000 0.37 0.0498 nein
+Schwarmoptimierung, Ameisenkolonialisierung,…
Algorithmen und Datenstrukturen | Stefan Roth & Zsolt István | SS 25 | 07 Fortgeschrittene Algorithmen-Entwurfsmethoden | 96
vi