WS 97/98: Algorithmen und Programmierung III - Übungsblatt 7

Abgabe bis 18.12., 12.30 Uhr (verlängert wegen des Streiks)


Aufgabe 7.1 (4 Punkte)

Berechne die minimale Höhe H(k) eines n-ären Baums mit k Knoten! Zeige H(k) = O(log k)!


Aufgabe 7.2 (6 Punkte)

a) (1 P.) Gesucht ist eine Funktion
	put :: * -> num ->   [*] -> [*]
	    || item position old    new
die aus einer Liste old eine Liste new konstruiert derart, daß an der Stelle position der alte Wert durch item ersetzt wird. Die Aufgabe soll ohne Verwendung der Miranda-Standardfunktionen gelöst werden. (Die Stellen einer Liste sind mit 0,1,2,... durchnumeriert.)

b) (2 P.) Für Vielwegbäume sei der folgende Typ vereinbart:
	tree* ::= N * [tree*]
Gesucht ist eine Funktion
	put :: * -> [num] -> tree* -> tree*
            || item position old      new
die aus einem Baum old einen Baum new konstruiert derart, daß an der Stelle position der alte Wert durch item ersetzt wird. (Die Teilbäume eines Baums sind mit 0,1,2,... durchnumeriert. Die Wurzel hat die Position []; die Wurzeln der Teilbäume eines Unterbaums mit Wurzelposition p haben die Positionen p++[0], p++[1],....)

c) (3 P.) Für die Vielwegbäume aus b) ist eine Funktion
	append :: * -> [num] -> tree* -> tree*
	       || item position old      new
gesucht, die aus einem Baum old einen Baum new konstruiert derart, daß an den Knoten position ein zusätzlicher Knoten mit Wert item angehängt wird.


Aufgabe 7.3 (6 Punkte)

Ein baumstrukturiertes Dateisystem kann wie folgt beschrieben werden:

Ein Dateisystem enthält Dateien, die entweder Verzeichnisse sind oder Daten enthalten. Ein Verzeichnis ordnet gewissen Namen gewisse Dateien zu. Eine Datei kann somit identifiziert werden durch Angabe eines Startverzeichnisses und eines Wegnamens, d.i. eine Folge von Namen, die vom Startverzeichnis zur betreffenden Datei führen.

a) Formuliere einen polymorphen algebraischen Typ file * **, der dieser Beschreibung von Dateien entspricht! * ist der Typ der Dateinamen, ** ist der Typ der in einem Nicht-Verzeichnis enthaltenen Daten.

b) Folgende Funktionen sollen entwickelt werden (path* = Typ der Wegnamen):
	valid    :: path* -> file * ** -> bool
	         || valid p d  liefert die Antwort auf die Frage,
	         || ob es eine Datei gibt, die sich von d aus über p
	         || erreichen läßt.

	isdir    :: path* -> file * ** -> bool
	         || isdir p d  liefert die Antwort auf die Frage,
	         || ob die von d aus über p erreichte Datei (falls
	         || vorhanden) ein Verzeichnis ist

	list     :: path* -> file * ** -> [*]
	         || list p d  liefert eine Liste der Namen in 
	         || demjenigen Verzeichnis, das von d aus über p
	         || erreicht wird (wenn es denn ein solches gibt).

	contents :: path* -> file * ** -> **
	         || contents p d  liefert den Inhalt der von d aus
	         || über p erreichbaren Datei (sofern es sie gibt und
	         || sie kein Verzeichnis ist).


Aufgabe 7.4 (6 Punkte)

Wir betrachten ein Dateisystem gemäß Aufgabe 3, bei dem sowohl die Daten als auch die Dateinamen Zeichenfolgen sind. Zu spezifizieren und zu implementieren sind die folgenden Funktionen, welche modifizierende Operationen auf Dateien und Dateisystemen nachbilden:

append, erase für Dateiinhalte,
create, delete, rename, copy für Dateien.





25.11.1997