Christian Scheideler u. v. a. Paderborn, 27. Mai 2011 Abgabe 3. Juni 2011, 11.15 Uhr Kästen im D3-Flur Übungsblatt zur Vorlesung Datenstrukturen und Algorithmen SS 2011 Blatt 7 Aufgabe 1: Entwickeln Sie einen Algorithmus, welcher in einem binären Suchbaum mit n ≥ 2 Knoten den (Unter-)Median in Zeit O(h), wenn h die Höhe des Baumes ist, bestimmt und zeigen Sie dessen Korrektheit. Sei n die Anzahl der Elemente im Suchbaum. Für n ungerade, ist der Median definiert als das Element an Position (n + 1)/2 im Inorder Baumdurchlauf; für n gerade, ist der Untermedian definiert als das Element an Position n/2 und der Obermedian als Element (n/2) + 1 im Inorder Baumdurchlauf. Beispiel: 1,2,3,4,5 → Median ist 3 1,2,3,4 → Untermedian ist 2, Obermedian ist 3 Tipp: Es dürfen zusätzliche Informationen in einem Knoten gespeichert werden. Aufgabe 2: Wir betrachten das Remove(T, e)-Problem für lineares Hashing, das aus einer gegebenen Hashtabelle T das Element e löschen soll. Geben Sie für die folgende Strategie den entsprechenden Pseudocode der Remove(T, e)-Operation an; beweisen Sie die Korrektheit und analysieren Sie die Laufzeit ihrer Algorithmen: Das zu löschende Element wird aus der Hashtabelle entfernt und es werden keine DELETEDMarker genutzt. Die Laufzeit ist dabei durch die Länge des Laufs (siehe Folie 29ff im Foliensatz 13), der das zu löschende Element enthält, beschränkt. Beachten Sie, dass Insert und Search weiterhin korrekt funktionieren müssen! Aufgabe 3: In dieser Aufgabe betrachten wir Operationen auf einem sortierten Feld F = [1, ..., n]. Wir nehmen an, dass dieses Feld zu jedem Zeitpunkt maximal n Elemente hat, und zu Beginn bereits sortiert ist. Auf F sollen nun folgende Operationen ausgeführt werden: Insert, Remove und Search. √ √ Nehmen Sie an, es gibt ein weiteres Feld Op = [1, . . . , n] der Grösse n. Operationen Insert und Remove auf F werden lazy bearbeitet: solange im Feld Op noch Platz ist, werden sie einfach hinten in Op eingefügt, statt das Feld F direkt zu bearbeiten – das Feld F bleibt also unverändert. Wir nehmen an, dass eine solche Einfügeoperation auf Op konstante Kosten O(1) hat. Sobald das Op Feld aber voll ist, muss ein Update ausgeführt werden, bei dem alle in Op gespeicherten Operationen auf das Feld F übertragen werden und Op geleert wird. Danach muss das Feld F wieder sortiert sein. Die Search Operation sucht immer zuerst in F nach einem Element; danach wird in Op nachgesehen, ob das Element bereits gelöscht oder noch nicht in F eingefügt wurde. • Zeigen Sie, dass der amortisierte Aufwand für die Operationen Insert, Remove und Search, unter der √ Voraussetzung, dass Update Kosten n hat, durch diese lazy√Bearbeitung durch O( n) beschränkt ist. Nutzen Sie hierbei die Potentialfunktion: n · Füllstand des Felds Op. √ Tipp: Das Einarbeiten der n Elemente von Op in das sortierte Feld kann in Zeit O(n) durchgeführt werden. Aufgabe 4: Schreiben Sie ein Java-Programm, das folgende Aufgaben erfüllt: 1. Das Programm erwartet als Parameter den Dateinamen einer Textdatei, welche eine Folge von natürlichen Zahlen enthält und ließt diese ein. 2. Das Programm fügt die Zahlen aus der eingelesenen Textdatei mittels der Operation AVL-Einfügen aus der Vorlesung in einen initial leeren AVL-Baum ein. Hierbei soll der AVL-Baum nach dem Einfügen jedes einzelnen Elementes wie unten spezifiziert ausgegeben werden. Bitte beachten Sie zusätzlich folgende Punkte: • Halten Sie die unten angegebenen Ein- und Ausgabespezifikationen bitte genau ein. Das bedeutet insbesondere: – Die Eingabedatei (bzw. der Pfad zu dieser inkl. des Dateinamens) soll als Eingabeparameter an das Programm übergeben werden. D.h. beispielsweise, dass die Eingabedatei nicht immer inputfile.txt heißen muss, die Eingabedatei nicht im gleichen Verzeichnis wie das Programm liegen muss und dass die Eingabe eines Dateinamens nicht über eine Eingabeaufforderung geschehen soll. – Es darf nur (und muss) genau das ausgegeben werden, was in der Ausgabespezifikation weiter unten definiert ist. D. h. es dürfen keine zusätzlichen Ausgaben erfolgen und jede Zeile beginnt mit x : “, wobei x den Wert des zuletzt ein” gefügten Elementes angibt. Achten Sie insbesondere auch auf die Leerzeichen vor und nach dem Doppelpunkt in jeder Zeile. • Ihr Programm muss in Java (Version ≤ 1.6) geschrieben sein. • Ihr Programm darf nur aus einer einzigen (Java-)Quelldatei bestehen. • Die Quelldatei Ihres Programmes muss Blatt7.java heißen. Dabei ist auf Groß- und Kleinschreibung zu achten. D. h. blatt7.java ist beispielsweise nicht korrekt. • Ihr Programm muss mit dem Befehl javac Blatt7.java auf einem Linux-Rechner der Uni kompilierbar und mit dem Befehl java Blatt7 ausführbar sein. • Die Abgabe dieser Aufgabe geschieht in digitaler Form. Hierfür laden Sie Ihr Programm bitte auf der Seite http://funalg.cs.upb.de bis zum 3. Juni 2011, 11.15 Uhr hoch. • Sie dürfen Ihr Programm in Gruppen von bis zu vier Personen abgeben. Geben mehrere Gruppen das selbe Programm ab, so erhalten alle betroffenen Gruppen für diese Aufgabe 0 Punkte. • Beispielinstanzen zum Testen Ihres Programmes finden Sie unter http://funalg.cs. upb.de/dua/blatt7.zip. Bei Missachtung dieser Punkte wird Ihr Programm nicht ausgewertet! Eingabespezifikation: Die einzulesende Datei besteht aus genau einer Zeile, welche eine Folge natürlicher Zahlen enthält. Die Zahlen sind jeweils durch ein Leerzeichen voneinander getrennt. Die Zeile endet mit einem abschließenden Leerzeichen. Ausgabespezifikation: Nach jedem Einfügen eines Elementes in den (initial leeren) AVLBaum soll das Programm eine Zeile in folgender Form ausgeben: x : T[1] T[2] ... T[k] Hierbei bezeichnet x das zuletzt in den AVL-Baum eingefügte Element, k die Anzahl der bereits in den AVL-Baum eingefügten Elemente und T[i] den Schlüssel des Elementes im AVL-Baum, was bei einem Inorder-Tree-Walk auf diesem als i-tes ausgegeben wird. T[1] T[2] ... T[k] ist also die Ausgabe des Algorithmus Inorder-Tree-Walk auf dem aktuellen AVL-Baum nach dem Einfügen von Element x. Beispiel: Angenommen die einzulesende Textdatei mit dem Namen inputfile.txt enthält folgenden Inhalt: 8 3 9 5 4 12 7 10 Nach dem Kompilieren mit dem Befehl javac Blatt7.java soll Ihr Programm durch Aufruf von java Blatt7 inputfile.txt folgende Ausgabe liefern: 8 : 8 3 : 3 8 9 : 3 8 9 5 : 3 5 8 9 4 : 3 4 5 8 9 12 : 3 4 5 8 9 12 7 : 3 4 5 7 8 9 12 10 : 3 4 5 7 8 9 10 12