Praktische Informatik 1 Aufgabenblatt Nr. 12 Aufgabe 1 (35 Punkte)

Werbung
Prof. Dr. Manfred Schmidt-Schauß
Künstliche Intelligenz/Softwaretechnologie
Fachbereich Biologie und Informatik/ Institut für Informatik
Johann Wolfgang Goethe-Universität Frankfurt am Main
Praktische Informatik 1
Wintersemester 2004/2005
Aufgabenblatt Nr. 12
Abgabe: Mittwoch 2. Februar 2005 vor! der Vorlesung
Aufgabe 1 (35 Punkte)
Wir betrachten folgende Implementierung von binären Bäumen mit Knotenmarkierungen in
Python:
Ein vollständiger binärer Baum der Tiefe n, wird in einem Feld der Größe 2n+1 − 1
gespeichert1 , die Feldeinträge entsprechen den Knotenmarkierungen. Die Reihenfolge
der Abspeicherung entspricht der military order 2 , d.h. zunächst sind die Knoten mit
Niveau 0, dann die Knoten mit Niveau 1, usw. nacheinander im Feld abgelegt. Ist
der Baum nicht vollständig, wird trotzdem für die fehlenden Knoten Platz im Feld
reserviert, der entsprechende Feldeintrag enthält den Wert None.
a) Geben Sie den abgebildeten Baum als Feld in Python gemäß der oben beschriebenen
Repräsentation an.
(8 Punkte)
23
2
38
37
14
7
19 26
b) Implementieren Sie Funktionen
– lChild(ar,i) und rChild(ar,i), die das linke bzw. rechte Kind des Knotens ar[i]
zurückgeben, falls dieses existiert.
(8 Punkte)
– descendants(ar,i), die alle Nachfahren des Knoten ar[i] zurück gibt. (8 Punkte)
– father(ar,i), die den Vater des Knotens ar[i] zurück gibt.
(5 Punkte)
– ancestors(ar,i), die alle Vorfahren des Knotens ar[i] zurück gibt.
(6 Punkte)
1
In Python gibt es den Operator ** zur Exponentiation
siehe dazu auch Abschnitt über Graphen und Bäume im Skript Einige Mathematische Grundlagen für
”
Informatiker“
2
1
Aufgabe 2 (25 Punkte)
Endliche Mengen seien in Python durch Listen dargestellt. Implementieren Sie in Python 3 eine
Funktion pmenge(menge), die die Potenzmenge, d.h. die Menge aller Teilmengen, der Eingabeliste menge berechnet.
Ein Prinzip zur Konstruktion der Potenzmenge P (M ) einer Menge M ist:
(
{∅},
falls M = ∅
P (M ) =
P (N ) ∪ {Ni ∪ {x} | Ni ∈ P (N )}, falls N = M \ {x} und x ∈ M
Aufgabe 3 (40 Punkte)
Ein Datentyp für n-äre Bäume mit Markierungen an allen Knoten kann in Haskell definiert
werden als:
data NBaum a = Blatt a | Knoten a [NBaum a]
deriving(Show)
a) Geben Sie den abgebildeten Baum mithilfe des Datentyps NBaum Int an.
(10 Punkte)
3
13
21
47
8
41
27
34
17
10
b) Implementieren Sie eine Funktion tiefe :: NBaum a -> Integer, die die Tiefe eines nären Baums berechnet.
(7 Punkte)
c) Der Grad eines Knotens entspricht der Anzahl seiner Kinder. Der Grad eines Baumes ist
der maximale Grad seiner Knoten.
Implementieren Sie eine Funktion degree :: NBaum a -> Integer, die den Grad eines
n-ären Baums berechnet.
(8 Punkte)
d) Implementieren Sie eine Funktion createNBaum :: Integer -> [a] -> NBaum a, die anhand einer gegeben Zahl i und einer Liste von Elementen einen n-ären Baum mit den
folgenden Eigenschaften generiert:
– Alle Elemente der Liste kommen im generierten Baum genau einmal vor.
– Kein Knoten hat einen Grad größer als i.
– Die Tiefe des Baumes ist minimal, d.h. es gibt keinen anderen Baum mit gleichem
Grad und gleichen Elementen, dessen Tiefe kleiner ist.
Begründen Sie die Korrektheit Ihrer Implementierung.
3
(15 Punkte)
Eventuell benötigen Sie für Ihre Lösung die Funktion deepcopy, die eine Liste tief“ kopiert, d.h. auch Un”
terlisten werden kopiert. Die Funktion finden sie im Modul copy, welches mit import copy importiert werden
kann.
2
Herunterladen