Blatt 3 - Professur für Theoretische Informatik

Werbung
Datenstrukturen
Sommersemester 2014
Prof. Dr. Georg Schnitger
Dipl.-Inf. Bert Besser
Arbeitsgruppe Theoretische Informatik, Institut für Informatik
Übungsblatt 3
Ausgabe: 20.05.2014
Abgabe : 27.05.2014
vor Vorlesungsbeginn
Hinweis: Wie immer sind alle Ergebnisse gut strukturiert zu begründen!
Aufgabe 3.1. (2+2+2+2)
Bäume
Bestimme für den rechts in Adjazenzlistendarstellung gegebenen Baum
Knoten, wenn
T
T
die Reihenfolge der
1
2
3
gemäÿ
4
a) Präorder,
5
b) Inorder,
6
c) Postorder
7
traversiert wird.
8
9
d) Gib das Vater-Array von
T
an.
10
-5
-6
-4
-9
-7
-
-1
-
-10
-3
-2
Aufgabe 3.2. (3+5)
-
Wer gewinnt?
2k Teams (wobei
k ≥ 1 gilt) im KO-System und modellieren den
Turnierverlauf durch den vollständigen binären Baum T . Jedes Blatt entspricht einem antreten-
Wir spielen ein Turnier mit
n=
dem Team. Jeder innere Knoten entspricht einem Spiel zwischen zwei Teams; beispielsweise ist
die Wurzel ein innerer Knoten und entspricht dem nalen Match.
T
liegt in Binärbaumdarstellung vor:
typedef struct Knoten {
string team;
Knoten *links, *rechts, *gewinner; }
Betrachte einen inneren (Spiel-)Knoten. Genau dann wenn das linke Team gewinnt, zeigt
gewinner auf das linke Kind, d.h. es gilt gewinner==links; gewinnt das rechte Team so
gewinner==rechts. Das Feld team ist ein leerer String. Bei Blättern zeigt gewinner auf
Blatt selbst und in team ist der Name des Teams vermerkt.
gilt
das
a) Wir wollen einen rekursiven Algorithmus entwerfen, der nach dem Finale den Namen des
gewinnenden Teams in das Feld
team
der Wurzelstruktur schreibt.
Gib kurz in Worten Deinen Lösungsansatz wieder. Beschreibe dann Deinen Algorithmus
mit Pseudocode und begründe seine Korrektheit. Wie schnell arbeitet Dein Algorithmus?
O-Notation abhängig von der Anzahl der Knoten in T .
Berechne nun für jeden Knoten v den Gewinner unter allen Teams im Teilbaum mit Wurzel
v . Wieder soll der Name des gewinnenden Teams im Feld team der Struktur von v stehen.
Bestimme die Laufzeit in
b)
Beschreibe zuerst Deine Idee und gib dann Pseudocode an. Analysiere wieder die Laufzeit.
Aufgabe 3.3. (8)
Gegeben sei der Baum
Schichtbetrieb
T
in Kind-Geschwister-Darstellung:
typedef struct Knoten {
int wert;
Knoten *LKind, *RGeschwister; }
Wir möchten die Werte aller Knoten in
T
ausgeben, erhalten aber nur einen Zeiger
root auf die
Struktur der Wurzel. Zuerst müssen wir den Wert der Wurzel drucken, danach die Werte ihrer
Kinder in Tiefe 1, gefolgt von den Werten aller Knoten in Tiefe 2, etc.: Wir drucken die Knoten
also gemäÿ steigender Tiefe aus.
Entwirf einen nicht -rekursiven Algorithmus, der diese Aufgabe erfüllt. Mit welcher Datenstruktur kannst Du die Knoten aus Schicht
Kinder der
i
nacheinander entnehmen und nach jeder Entnahme die
i + 1-ten Schicht so einfügen, dass sie nach allen Knoten der i-ten Schicht erscheinen?
Beschreibe wieder Deinen Ansatz zuerst in Worten und gib dann Pseudocode an. Welche Zeit
benötigt Dein Algorithmus in
O-Notation in Abhängigkeit von der Anzahl n der Knoten von T ?
Gehe davon aus, dass das Drucken eines Knotenwerts in konstanter Zeit möglich ist.
Aufgabe 3.4. (8 Extrapunkte)
Spielbäume
Alice und Bob spielen gegeneinander. Rundenweise wechseln sich die beiden ab. Alice beginnt.
Wir modellieren alle möglichen Spielverläufe durch einen Spielbaum
T
in Kind-Geschwister-
Darstellung:
enum Spieler {ALICE, BOB};
enum Gewinner {A, B, NICHT_INITIALISIERT};
typedef struct Knoten {
Spieler s;
Gewinner g;
Knoten *LKind, *RGeschwister; }
Die Wurzel von
T
entspricht dem Spielbeginn: Wir sagen, dass Alice in der Wurzel am Zug ist,
root auf die Struktur der Wurzel gilt root->s==ALICE. Allgemein gilt: Wenn
v ist und Alice in v am Zug ist, d.h. p->s==ALICE
0
0
gilt, dann hat v für jeden möglichen Zug von Alice ein Kind v und Bob ist im Kind v am Zug.
Natürlich gilt analoges, sollte Bob in v am Zug sein. Ist kein Zug für den in v ziehenden Spieler
möglich, dann ist v ein Blatt und es gilt p->g==A (Alice hat gewonnen) oder p->g==B (Bob hat
gewonnen). Für innere Knoten ist der Gewinner g anfänglich auf NICHT_INITIALISIERT gesetzt.
d.h. für den Zeiger
p
ein Zeiger auf die Struktur des Knotens
Wir erhalten den Zeiger
root und sollen entscheiden, ob Alice eine Gewinnstrategie hat, d.h. ob
Alice den Sieg selbst dann erzwingen kann, wenn Bob den jeweils besten Gegenzug auswählt.
Beschreibe einen Algorithmus in Pseudocode und analysiere seine Laufzeit in Abhängigkeit von
der Anzahl der Knoten in
T.
Herunterladen