http://www.mpi-sb.mpg.de/~hannah/info5-ws00 IS UN R S WS 2000/2001 E R SIT S Bast, Schömer SA IV A Grundlagen zu Datenstrukturen und Algorithmen A VIE N Lösungsvorschläge für das 1. Übungsblatt Letzte Änderung am 23. November 2000 Aufgabe 2 (a) + (b) integer operator*(integer& a, digit d) { int n = a.digits(); integer p = 0; // Produkt ohne die Überträge integer c = 0; // Überträge int pi = 0; for (int i = 0; i < n; i++) { pi = a[i] * d; p[i] = pi % B; c[i+1] = pi / B; } return school_add(p,c); } Beispiel: 3798 * 6 -------8248 1454 -------22788 <- p <- c <- p+c Aufgabe 3 Pn−1 Pm−1 Sei B ≥ 2, a = i=0 ai B i und b = j=0 b B j . Die k-te Zeile bei Durchführung des SchulmultiP j i P k plikationsalgorithmus ist dann gerade ( a B )b B = B i+k . DurchPAufsummieren erhält i k i i a i bk Pm−1 Pn−1 P P P m−1 n−1 n−1 m−1 i+k man also k=0 = k=0 (bk B k i=0 ai B i ) = ( i=0 ai B i )( j=0 bj B j ) = ab, was i=0 ai bk B zu zeigen war. Aufgabe 4 110100101 : 1001 = 101110 1001 ---- 10000 1001 ---1111 1001 ---1100 1001 ---111 Der Rest bei der Division ist also (111)2 = (7)10 . Aufgabe 5 Wir betrachten die Binärdarstellung, d.h. B = 2. integer school_mod(integer& a, integer& b) { /* Sonderfaelle */ if(b==0) {return ERROR;} // irgend eine Fehlermeldung if(b>a) {return a;} if(b==a) {return 0;} integer integer int int temp = 0; result = 0; lb = b.digits(); lamlb = a.digits() - lb; /* Die obersten lb-1 Ziffern von a werden in temp gespeichert */ for(int k=0; k<(lb-1); k++) {temp[k] = a[lamlb+1+k];} /* Division */ for(int i=lamlb; i>=0; i--) { /* betrachte naechste Stelle */ result << 1; temp << 1; temp[0] = a[i]; if(temp>=b) // man kann b von temp abziehen { temp = temp - b; result[0] = 1; } else {result[0]=0;} // man kann b nicht von temp abziehen } return temp; // in temp steht der Rest der Division, // in result steht das Ergebnis der Division, das } // koennte man hier auch weglassen. Für die Analyse relevant ist die Zeile temp = temp - b; Das ist eine Subtraktion von zwei (maximal (lb + 1)-stelligen) Zahlen. Diese kann analog zu school add durchgeführt werden und benötigt dann (lb + 1) primitive Operationen (d.h. Subtraktionen von einstelligen Zahlen). Die Schleife hat (lamlb + 1) Durchläufe, d.h. es gibt insgesamt maximal (lamlb + 1)(lb + 1) primitive Operationen. Es ist jetzt lb = k lamlb = (n + k) − k = n Also hat man (n + 1)(k + 1) = O(nk) primitive Operationen.