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