Professional Documents
Culture Documents
Kniesel
J. Tautges, P. Bihler oose.cs.uni-bonn.de
Sommersemester 2008
Aufgabe 2 (Wildcard - 2 Punkte) Was versteht man im Zusammenhang mit Java Generics unter dem Begri Wildcard ? Musterlsung: Wildcards knnen als anonyme Typparameter verstanden werden: Parameter, die o o nicht weiter referenziert werden mssen. Wildcards als Lsung des Problems der Invarianz bei Geu o nerics (Ableitungsbeziehung zwischen Typargumenten ubertrgt sich nicht auf generische Klassen). a Beispiel fr Syntax: Box<?> b; u http://java.sun.com/docs/books/tutorial/java/generics/wildcards.html Aufgabe 3 (Listen - 10 Punkte) a) (6 Punkte) Erweitern Sie die in der Vorlesung vorgestellte Implementierung der Klasse TList um die Methoden get(int i), die das i -te Element der Liste zurckgibt, u delete(int i), die das i -te Element aus der Liste entfernt, insert(T elem, int i), die das Element elem an der i -ten Stelle der Liste einfgt. u Analog zur Array-Indizierung sei hierbei i = 0 die Position des ersten Listenelements. Behandeln Sie jeweils die Ausnahme, dass der Index i die Lnge der Liste ubersteigt! a Musterlsung: (bereits generisch) o
public T get(int i) { TNode<T> temp = head; try { for(int n = 0; n < i ; n++) temp = temp.next; return temp.getData(); }
catch (NullPointerException e) { System.out.println("get()::Index bersteigt Listenlnge!"); u a return null; } } public void delete(int i) { TNode<T> temp = head; if(i == 0) { this.head = this.head.next; return; } try { for(int n = 0; n < i - 1; n++) temp = temp.next; temp.next = temp.next.next; } catch (NullPointerException e) { System.out.println("delete()::Index bersteigt Listenlnge!"); u a } } public void insert(T elem, int i) { TNode<T> node = new TNode<T>(elem); TNode<T> temp = head; if(i == 0) { node.next = temp.next; this.head = node; return; } try { for(int n = 0; n < i-1 ; n++) temp = temp.next; node.next = temp.next; temp.next = node; } catch (NullPointerException e) { System.out.println("insert()::Index bersteigt Listenlnge!"); u a } }
b) (4 Punkte) Formen Sie die Klassen TNode und TList zu einer generischen Liste mit Typparameter um! Musterlsung: o
public class TList<T> { private TNode<T> head; public TList() { head = null; } // Anpassung der Methoden analog zu Aufgabe 3a) }
Aufgabe 4 (Matrizenmultiplikation - 11 Punkte) a) (5 Punkte) Implementieren Sie eine Klasse DoubleMatrix, die Matrizen allgemeiner Dimension von Zahlen vom Typ double reprsentiert. Es sollen also nicht nur quadratische Matrizen behandelt a werden knnen, sondern allgemeine Matrizen, die lineare Abbildungen von Rm Rn darstellen o (wobei R durch double approximiert wird und n und m positive Zahlen vom Typ int sind). Implementieren Sie eine Funktion matrixMult zur Durchfhrung der Matrizenmultiplikation! u Musterlsung: o
/** * Klasse zur Reprsentation allgemeiner Matrizen mit Eintrgen vom Typ Double a a * @author Paul Mller, Markus Schmitz, Aaron Schmischke, Jochen Tautges u */ public class DoubleMatrix { private int rows; private int columns; private double values[][]; public DoubleMatrix() { this.rows = 0; this.columns = 0; this.values = null; } public DoubleMatrix( int i ) { this( i, i ); } public DoubleMatrix( int zeilen, int spalten ) { this.rows = zeilen; this.columns = spalten; this.values = new double[zeilen][spalten]; } public DoubleMatrix( double values[][] ) { this.rows = values.length; this.columns = values[0].length; this.values = values; } /** * Funktion zur Multiplikation zweier allgemeiner Matrizen * @param mat allgemeine (mxn)-Matrix * @return Ergebnis einer Matrizenmultiplikation * @exception IllegalArgumentException bei inkompatibler Matrizendimensionen */ public DoubleMatrix matrixMult( DoubleMatrix mat ) { if( this.columns != mat.rows ) throw new IllegalArgumentException(); DoubleMatrix result = new DoubleMatrix( this.rows, mat.columns ); for( int i = 0; i < this.rows; i++ ) { for( int j = 0; j < mat.columns; j++ ) { result.values[i][j] = 0.0; for( int k = 0; k < this.columns; k++ ) result.values[i][j] += this.values[i][k] * mat.values[k][j]; } } return result; } public void setValue( int i, int j, double value ) { this.values[i][j] = value; } public double getValue( int i, int j ) { return this.values[i][j]; } public int getRows() { return this.rows; }
public int getColumns() { return this.columns; } /** * Funktion zur Ausgabe einer Matrix */ public void Print() { for( int i = 0; i < rows; i++ ) { for( int j = 0; j < columns; j++ ) { System.out.printf("%f\t",values[i][j]); } System.out.println(); } } }
b) (3 Punkte) Behandeln Sie die Ausnahme, dass die Operation wegen inkompatibler Dimensionen der Matrizen nicht durchgefhrt werden kann! Geben Sie als Teil der Ausnahmebehandlung eine u Fehlermeldung auf System.err aus! Dokumentieren Sie ihren Quellcode mit javadoc! Musterlsung: siehe Aufgabe 4 a) o c) (3 Punkte) Implementieren Sie eine Klasse GenericMatrix, welche dieselbe Funktionalitt besitzt a wie die Klasse DoubleMatrix, jedoch den Datentyp Matrix generisch (Zahltyp) realisiert. Musterlsung: o
public class GenericMatrix<T extends Number> { int rows; int columns; Number[][] values; // Konstruktoren ... public GenericMatrix( int zeilen, int spalten ) { this.rows = zeilen; this.columns = spalten; this.values = new Number[zeilen][spalten]; } public GenericMatrix( T values[][] ) { this.rows = values.length; this.columns = values[0].length; this.values = values; } public GenericMatrix<T> matrixMult( GenericMatrix<T> mat ) { if( this.columns != mat.rows ) throw new IllegalArgumentException(); GenericMatrix<T> result = new GenericMatrix<T>( this.rows, mat.columns ); for( int i = 0; i < this.rows; i++ ) { for( int j = 0; j < mat.columns; j++ ) { result.values[i][j] = 0.0; for( int k = 0; k < this.columns; k++ ) result.values[i][j] = result.values[i][j].doubleValue() + this.values[i][k].doubleValue() * mat.values[k][j].doubleValue(); } } return result; }
public void setValue( int i, int j, T value ) { this.values[i][j] = value; } public Number getValue( int i, int j ) { return this.values[i][j]; } ... }
Aufgabe 5 (Matrizenmultiplikation mit Multithreading - 6* Punkte) * Bonusaufgabe: Durch Lsen dieser Aufgabe knnen Sie sich zustzliche Bonuspunkte verdienen! o o a a) (4 Punkte) Bei der Multiplikation zweier Matrizen knnen oensichtlich alle Eintrge der Ergebo a nismatrix unabhngig voneinander berechnet werden. Nutzen Sie diese Erkenntnis aus und versuchen a Sie Ihre Implementierung aus der vorigen Aufgabe mithilfe von Multithreading zu beschleunigen! Musterlsung: (zur Verfgung gestellt von Paul Mller, Markus Schmitz, Aaron Schmischke) o u u
https://sewiki.iai.uni-bonn.de/ media/teaching/lectures/oose/2008/aufgaben/Blatt10Aufgabe05.rar
b) (2 Punkte) Ist es sinnvoll, fr jeden Eintrag der Ergebnismatrix einen eigenen Thread zu starten? u Oder lsst sich mit weniger Threads eine optimale Rechenzeit erreichen? Testen Sie verschiedene a Implementierungen und diskutieren Sie die Ergebnisse! Geben Sie an, wie viele Prozessoren die von Ihnen verwendeten Rechner besitzen! Hinweis: Den Zeitbedarf (in Millisekunden) eines Anweisungsblocks knnen Sie sich folgendermaen anzeigen lassen1 : o long tix = System.currentTimeMillis(); { ... // Anweisungen } System.out.println(System.currentTimeMillis()-tix); Musterlsung: (zur Verfgung gestellt von Paul Mller, Markus Schmitz, Aaron Schmischke) o u u
1 Die Genauigkeit hngt von der Aktualisierungsrate der Systemzeit und damit vom Betriebssystem ab. Um aussaa gekrftige Ergebnisse zu erzielen sollten Sie daher die Rechenzeiten fr groe Anzahlen an hintereinander ausgefhrten a u u Multiplikationen vergleichen.