TU Ilmenau, Fakultät IA Institut TI, FG Komplexitätstheorie und Effiziente Algorithmen Prof. Dr. (USA) M. Dietzfelbinger, Dr. M. Brinkmeier, Dr. E. Hübel, http://www.tu-ilmenau.de/fakia/afs ws07.html K Algorithmen und Datenstrukturen, SS08 Übungsblatt Stunde 0 für die 15. Woche 2008 Aufgabe 1 (Euklidscher Algorithmus) Gegeben sind zwei ganze Zahlen a und b, die höchsten n Bits besitzen. Gesucht ist der größte gemeinsame Teiler ggT (a, b). a für b = 0 ggT (a, b) := ggT (b, a mod b) für b > 0 1. Wie groß ist die Anzahl der rekursiven Aufrufe? 2. Wie groß ist die Operationskomplexität (in O -Notation), d.h. wie viele arithmetische (modulo) Operationen werden ausgeführt? 3. Wie groß ist die Bit-Komplexität (in O -Notation), d.h. wie viele Bitoperationen werden ausgeführt? Aufgabe 2 (Schnelle modulare Exponentiation) Gegeben sind drei ganze Zahlen a, b und m mit höchsten n Bits. Gesucht ist ab mod m. Der folgende Algorithmus löst diese Aufgabe, ist aber nicht praktikabel. Warum? Algorithmus SM E(a, b, m) p := 1; for i := 1 to b do p := p · a mod m; return p. //Es werden b Multiplikationen ausgeführt. Besser: Rekursion. Algorithmus f astexp(a, b, m): if b = 0 then return 1; if b = 1 then return a mod m; (*b ≥ 2*) p1 := f astexp(a, b 2b c, m); if b ungerade then return (((p1 · p1 ) mod m) · a) mod m; if b gerade then return (p1 · p1 ) mod m. 1. Erklären Sie, weshalb der Algorithmus das korrekte Resultat liefert. 2. Wie groß ist die Anzahl der rekursiven Aufrufe? 3. Wie groß ist die Operationskomplexität (in O -Notation), d.h. wie viele arithmetische (modulo) Operationen werden ausgeführt? 4. Wie groß ist die Bit-Komplexität (in O -Notation), d.h. wie viele Bitoperationen werden ausgeführt? 2 Algorithmen und Datenstrukturen, SS08 Übungsblatt Stunde 0 Aufgabe 3 (Maximale Teilsumme) Gegeben a1 , . . . , an ∈ Z. P Finde 1 ≤ i, j ≤ n mit ai + . . . + aj maximal. (Der Fall i > j mit al = 0 ist erlaubt.) i≤l≤j 1. Der dumme Algorithmus. Man berechnet si,j für jedes Paar (i, j) einzeln und löst das Maximumproblem. Algorithmus DOOF (a1 , . . . , an ) M := 0; ii := 1; jj := 0; for i := 1 to n do for j := i to n do S := ai + . . . + aj ; if S > M then ii := i; jj := j; M := S; return ii, jj. Schätzen Sie den Rechnungsaufwand nach oben und nach unten ab (in Θ -Notation). 2. Der naive Algorithmus. Man greift bei der Summenbildung si,j für j = i, i + 1, . . . , n auf das vorherige Ergebnis zurück: si,i = ai und si,j+1 = si,j + aj+1 für j = i, . . . , n − 1. Man führt dies für i = 1, 2, . . . , n durch: Algorithmus N ORM AL(a1 , . . . , an ) M := 0; ii := 1; jj := 0; for i := 1 to n do S := 0; for j := i to n do S := S + aj ; if S > M then ii := i; jj := j; M := S; return ii, jj. Schätzen Sie den Rechnungsaufwand nach oben und nach unten ab (in Θ -Notation). 3. Der Divide-And-Conquer-Algorithmus. Es werden nicht alle Summen si,j ausgerechnet. Hier nehmen wir (zur Vereinfachung) an, dass die Anzahl n der Zahlen eine Zweierpotenz ist: n = 2k . Idee: Für den Abschnitt i..j, der die Summe maximiert, gibt es drei Möglichkeiten: 1. Fall: ( links der Mitte“) i ≤ j ≤ 12 n. ” 2. Fall: ( rechts der Mitte“) 21 n + 1 ≤ i ≤ j ≤ n. ” 3. Fall: ( die Mitte überspannend“) i ≤ 12 n und 21 n + 1 ≤ j. ” Entwickeln Sie einen entsprechenden Algorithmus und analysieren Sie ihn. 4.∗ Der Linearzeit-Algorithmus. Entwickeln Sie einen Linearzeit-Algorithmus ! ∗ Etwas anspruchsvoller.
© Copyright 2024 ExpyDoc