Blatt 12 - SE-Wiki

Werbung
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
Herunterladen