Effiziente Algorithmen - fbi.h

Werbung
Motivation / Einleitung
Effiziente Algorithmen
Wintersemester 2009
Steffen Lange
0/1, Folie 1
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Problemstellung
zulässige Eingaben:
•
•
Dezimaldarstellung einer Zahl a, d.h. a = a[n]...a[1]
Dezimaldarstellung einer Zahl b, d.h. b = b[n]...b[1]
zulässige Ausgaben:
•
Dezimaldarstellung der Zahl c = a*b, d.h.
c = c[m]...c[1] mit m ! 2n
! ... für die Laufzeitanalyse relevant
•
•
0/1, Folie 2
Größe der Eingabe = „Länge“ der Dezimalzahlen (/* also n */)
relevante Operation
•
Elementar-Operationen auf Ziffern-Ebene (/* 3*9, 7+5, 3-2*/)
•
Shift-Operationen auf Ziffern-Ebene
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Schulmethode
7641 * 8512
0/1, Folie 3
© 2009 Prof. Steffen Lange
-
61128000
3820500
76410
15282
4 EO + 3 SO
4 EO + 2 SO
4 EO + 1 SO
4 EO + 0 SO
61128000
3820500
91692
5 EO
61128000
3912192
5 EO
65040192
7 EO
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Schulmethode (/* Analyse für den worst case */)
•
•
Phase 1: Multiplikation
•
n mal
•
insgesamt !(n2) viele Elementar-Operationen
•
insgesamt !(n2) viele Shift-Operationen
Phase 2: Addition
•
n-1 mal
•
insgesamt !(n2) viele Elementar-Operationen
... im worst case benötigt die Schulmethode !(n2) viele ElementarOperationen und !(n2) viele Shift-Operationen
0/1, Folie 4
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 1, Vorüberlegung */)
•
es seien a = av*x + ah und b = bv*x + bh
a*b = (av*bv)*x2 + (av*bh + ah*bv)*x + ah*bh
... wähle x derart, daß
•
•
0/1, Folie 5
die Multiplikationen mit x bzw. x2 „einfach“ sind
av und ah bzw. bv und bh „kürzer“ als a bzw. b sind
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 1, Beispiel */)
7641 * 8512 =
=
=
=
(76*85)*104 + (76*12 + 41*85)*102 + (41*12)
6460*104 + (912+3485)*102 + 492
64600000 + 439700 + 492
65040192
76 * 85
(7*8)*102 + (7*5 + 6*8)*10 + (6*5)
56*102 + (35+48)*10 + 30
5600 + 830 + 30
6460
=
=
=
=
...
41 * 12
0/1, Folie 6
© 2009 Prof. Steffen Lange
= ...
-
HDa/FbI
... 7*8, 7*5, ... werden direkt berechnet
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 1 */)
a[n] ... a[1] = a[n] ... a[n/2]*10n/2 + a[n/2-1] ... a[1]
a
av
ah
b[n] ... b[1] = b[n] ... b[n/2]*10n/2 + b[n/2-1] ... b[1]
b
bh
bv
„Divide“–Schritt:
bestimme av, ah, bv und bh
„Conquer“–Schritt:
bestimme c1 = av*bv, c2 = av*bh, c3 = ah*bv und c4 = av*bh
„Merge“–Schritt:
bestimme d1 = c1*10n, d2 = c2 + c3 und d3 = d2*10n/2
bestimme d1 + d3 + c4
0/1, Folie 7
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 1; Analyse */)
•
es bezeichne #op(A,n) die Anzahl der Elementar-Operationen und ShiftOperationen, die diese Version bei Eingabe von Dezimalzahlen der
Länge n benötigt
„Divide“–Schritt:
!(n) viele Shift-Operationen
„Conquer“–Schritt: 4*#op(A,n/2) viele Elementar- und ShiftOperationen
„Merge“–Schritt:
!(n) viele Shift-Operationen und !(n) viele
Elementar-Operationen
Es gilt: #op(A,n) = 4*#op(A,n/2) + !(n).
Damit gilt: #op(A,n) " !(n2).
0/1, Folie 8
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 2, Vorüberlegung */)
•
es seien a = avx + ah und b = bvx + bh
ab = (av*bv)*x2 + (av*bh + ah*bv)*x + ah*bh
av*bh + ah*bv = av*bh + ah*bv + av*bv + ah*bh - av*bv - ah*bh
= av*bv + ah*bh - ah*bh + ah*bv + av*bh - av*bv
= av*bv + ah*bh - (ah - av)*(bh - bv)
a*b = (av*bv)*x2 + (av*bv + ah*bh - (ah - av)*(bh - bv))*x + ah*bh
0/1, Folie 9
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 2, Beispiel */)
7641 * 8512 =
=
=
=
=
(76*85)*104 + (76*85 + 41*12 - (41-76)*(12-85))*102 + (41*12)
6460*104 + (6460+492-((-35)*(-73)))*102 + 492
64600000 + (6460+492-2555)*102 + 492
64600000 + 439700 + 492
65040192
76 * 85
(7*8)*102 + (7*8 + 6*5 - (6-7)*(5-8))*10 + (6*5)
56*102 + (56+30-((-1)*(-3)))*102 + 30
5600 + (56+30-3)*102 + 30
5600 + 830 + 30
6460
=
=
=
=
=
...
41 * 12
0/1, Folie 10
... 7*8, 7*5, ... werden direkt berechnet
= ...
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 2 */)
a[n] ... a[1] = a[n] ... a[n/2]*10n/2 + a[n/2-1] ... a[1]
a
av
ah
b[n] ... b[1] = b[n] ... b[n/2]*10n/2 + b[n/2-1] ... b[1]
b
bh
bv
„Divide“–Schritt:
bestimme av, ah, bv und bh sowie e1 = av - ah, e2 = bv - bh
„Conquer“–Schritt:
bestimme c1 = av*bv, c2 = ah*bh, und c3 = e1*e2
„Merge“–Schritt:
bestimme d1 = c1*10n, d2 = c1 + c2 - c3 und d3 = d2*10n/2
bestimme d1 + d3 + c2
0/1, Folie 11
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Illustrierendes Beispiel – Multiplikation großer Zahlen
! Divide and Conquer (/* Version 2; Analyse */)
•
es bezeichne #op(A,n) die Anzahl der Elementar-Operationen und ShiftOperationen, die diese Version bei Eingabe von Dezimalzahlen der
Länge n benötigt
„Divide“–Schritt:
!(n) viele Elementar-Operationen
„Conquer“–Schritt:
3*#op(A,n/2) viele Elementar-und ShiftOperationen
„Merge“–Schritt:
!(n) viele Shift-Operationen und !(n) viele
Elementar-Operationen
Es gilt: #op(A,n) = 3*Op(A,n/2) + !(n).
Damit gilt: #op(A,n) " !(nlog2(3)).
... log2(3) = 1.585...
0/1, Folie 12
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Abschätzung von rekursiven Gleichungen
! Mastertheorem
Es seien a # 1, b > 1 und f(.) eine Funktion von N ! R+ mit f(n) " !(nk)
für ein k # 0. Ferner habe die interessierende rekursive Gleichung die
Form
F(n) = a*F(n/b) + f(n).
Dann gilt:
•
•
•
F(n) " !(nk), falls a < bk
F(n) " !(nk * log(n)), falls a = bk
F(n) " !(nc) mit c = logb(a), falls a > bk
... a = Anzahl der Teilprobleme in Schritt 2 (/* Conquer */)
... n/b = Größe der Teilprobleme in Schritt 2 (/* Conquer */)
... f(n) = Laufzeit für Schritt 1 (/* Divide */) und Schritt 3 (/* Merge */)
0/1, Folie 13
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Abschätzung von rekursiven Gleichungen
! Anwendung des Mastertheorems (/* Divide & Conquer, Version 1 */)
#op(A,n)
= 4 #op(A,n/2) + !(n1)
... also a = 4, b = 2, k = 1
#op(A,n) " !(n2))
! Anwendung des Mastertheorems (/* Divide & Conquer, Version 2 */)
#op(A,n)
= 3 #op(A,n/2) + !(n1)
... also a = 3, b = 2, k = 1
#op(A,n) " !(nc) mit c = log2(3)
0/1, Folie 14
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Gliederung der Vorlesung
1.
2.
3.
4.
5.
0/1, Folie 15
Asymptotische Notationen
Zahlentheoretische Algorithmen
Sortierverfahren
String Matching
Ausgewählte Datenstrukturen
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Motivation / Einleitung
Literaturempfehlungen
0/1, Folie 16
•
U. Schöning: Algorithmik, Spektrum Akademischer Verlag, 2001.
•
Th.H. Cormen, Ch.E. Leiserson, R Rivest, C. Stein: Algorithmen - eine
Einführung, 2. Auflage Oldenbourg Verlag, 2007
© 2009 Prof. Steffen Lange
-
HDa/FbI
-
Effiziente Algorithmen
Herunterladen