Universität Bonn Institut für Informatik II Institut für Informatik III 01.07.2008 Prof. Dr. A. Weber, Dr. G. Kniesel J. Tautges, P. Bihler oose.cs.uni-bonn.de Sommersemester 2008 Übungen zur Vorlesung Objektorientierte Softwareentwicklung (BA-INF-024) Aufgabenblatt 12 Zu bearbeiten bis: 11.07.2008 Aufgabe 1 (AWT, Listen - 2 Punkte) Überlegen Sie sich für jede Aussage ein Argument, mit dem Sie eindeutig bestimmen können, ob die Aussage wahr oder falsch ist. Für jede richtig angekreuzte Antwort werden 0,5 Punkte angerechnet, für jede falsch angekreuzte Antwort 0,5 Punkte abgezogen. Nicht angekreuzte Antworten geben keinen Punktabzug. wahr falsch Alle AWT- und Swing-Methoden sind thread-sicher. Das Aussehen einer mit AWT erzeugten, grafischen Benutzeroberfläche ist plattformunabhängig. Der Ursprung des Koordinatensystems grafischer AWT-Elemente liegt links oben. Sortiertes Einfügen in einfach verkettete Listen dauert im Allgemeinen länger als das Einfügen am Ende der Liste. Aufgabe 2 (Listen - 4 Punkte) Gegeben sei folgendes Rahmenprogramm, mit dem Sie eine Datei filename.txt (die sich im selben Verzeichnis befindet wie Ihr Projekt) zeilenweise einlesen können: import java.io.*; public class Blatt12 { public static void main( String args[] ) { try { BufferedReader input = new BufferedReader(new FileReader("filename.txt")); String line; while ((line = input.readLine()) != null) { //... } input.close(); } catch ( IOException e ) { System.out.println( "Fehler beim Lesen der Datei" ); } } } a) Laden Sie die Textdatei en gb.txt von der Vorlesungswebsite herunter. Lesen Sie diese mithilfe des vorgegebenen Rahmenprogramms zeilenweise in eine Liste1 vom Typ über String ein. Verwenden Sie für den Listenaufbau einmal die Methode insertFirst(), einmal die Methode insertLast() und einmal die Methode insertSorted(). Erklären Sie die unterschiedlichen Laufzeiten! b) Erweitern Sie die Klasse List um die Funktion find(T elem), die den Index (des ersten Vorkommens) des Elements elem in der Liste zurückgibt! Wie lange dauert die Suche nach einem Element in der Liste im schlimmsten Fall? 1 Benutzen Sie die generische Implementierung aus der Vorlesung, vgl. auch Übungsblätter 10 und 11 1 Aufgabe 3 (Suchbäume - 8 Punkte) Sowohl in der Vorlesung als auch in der Übung haben Sie bereits Binärbäume kennengelernt. Ein binärer Suchbaum ist ein binärer Baum, bei dem die Knoten des linken Teilbaums eines Knotens nur kleinere Werte und die Knoten des rechten Teilbaums eines Knotens nur größere oder gleichgroße Werte als der Knoten selbst besitzen. (Wikipedia) a) Erstellen Sie eine Klasse isSearchTree, die das Interface NodeActionInterface implementiert und eine boolean-Variable enthält, die mit true belegt wird, wenn der betrachtete Baum die Suchbaumeigenschaft erfüllt, andererseits mit false. b) Erweitern Sie die aus der Vorlesung bekannte (generische) Implementierung der Klasse Tree um die Funktion insertSorted(Node n), die den Knoten n so in einen binären Suchbaum einfügt, dass die Suchbaumeigenschaft erhalten bleibt! Implementieren Sie außerdem eine Methode find(), die die Struktur des binären Suchbaums ausnutzt um ein Element darin zu finden! Aufgabe 4 (Entartete Suchbäume - 5 Punkte) a) Bauen Sie mit mithilfe der Methode insertSorted() einen binären Suchbaum vom Typ String auf, indem Sie die Datei en GB.txt zeilenweise einlesen und für jede Zeile einen Knoten einfügen, der den Inhalt der Zeile als Wert erhält.2 b) Beschreiben Sie die Struktur des in der vorhergehenden Aufgabe erstellten Baums. Werfen Sie dazu einen Blick in die Datei en GB.txt! Was hat man gegenüber der Listenimplementierung gewonnen? Aufgabe 5 (Balancierte Suchbäume - 6 Punkte) Um die Operationen Suchen und Einfügen in einem Suchbaum möglichst effizient durchführen zu können, muss seine Höhe minimal gehalten werden. Wenn für jeden Knoten eines Baumes gilt, dass sich die Höhen seines linken und seines rechten Teilbaums höchstens um ein bestimmtes Verhältnis unterscheiden, heißt der Baum (höhen)balanciert. Um die Balance eines Baums aufrechtzuerhalten, müssen nach dem Einfügen eines Knotens evtl. Rebalancierungsmaßnahmen durchgeführt werden. Während solche Maßnahmen aufgrund ihrer Komplexität erst in der Bonusaufgabe betrachtet werden, wollen wir hier einen balancierten Suchbaum aufbauen, indem wir die Tatsache ausnutzen, dass die Daten, mit denen wir den Baum füllen, bereits sortiert sind. a) Lesen Sie die Zeilen der Datei en GB.txt in eine ArrayList() ein.3 Implementieren Sie eine rekursive Funktion insertSortedArrayIntoTree(ArrayList() a, int lb, int ub), die die Elemente der sortierten ArrayList (mithilfe der Methode insertSorted() aus Aufgabe 3 b)) in einer Reihenfolge in den Baum einfügt, die dessen Balance garantiert. Tipp: Mit lb=0 und ub=a.size()-1 beginnen, das mittlere Element (mit Index (ub+lb)/2) in den Baum einfügen und rekursiv mit den beiden Teillisten“ fortfahren. ” b) Testen Sie Ihren Suchbaum sowie ihre Methode find() aus Aufgabe 3 b), indem Sie im Baum nach verschiedenen Wörtern suchen! 2 Leiten Sie den generischen Typparameter von der Klasse Comparable ab und benutzen Sie zum Vergleichen zweier Strings die Methode compareTo(). 3 Da es sich bei der Datei um eine Wortliste handelt, die bereits bezüglich der durch compareTo() auf Strings definierten Ordnung sortiert ist, kann auch die ArrayList als sortiert angenommen werden! 2 Aufgabe 6 (Bonusaufgabe - 5* Punkte) * Bonusaufgabe: Durch Lösen dieser Aufgabe können Sie sich zusätzliche Bonuspunkte verdienen! Implementieren Sie eine Klasse zur Repräsentation von AVL-Bäumen! Implementieren Sie eine Methode insert(), die einen Knoten einfügt und anschließend eventuell notwendige Rebalancierungsmaßnahmen vornimmt um das Gleichgewicht des Baums zu gewährleisten! Nähere Informationen zu AVL-Bäumen finden Sie hier: http://de.wikipedia.org/wiki/AVL-Baum 3