¨Ubungsblatt zur Vorlesung Datenstrukturen und Algorithmen SS

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