21.07.2013 Aufrufe

Übungen zum Präsenzmodul Algorithmen und Datenstrukturen

Übungen zum Präsenzmodul Algorithmen und Datenstrukturen

Übungen zum Präsenzmodul Algorithmen und Datenstrukturen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Technische Universität München SIGNAL-Kurs 2002/2004<br />

Fakultät für Informatik Lösungsvorschläge zu Blatt 4<br />

Prof. Dr. P. Hubwieser,<br />

G. Aiglstorfer, A. Staller<br />

17. Februar 2004<br />

<strong>Übungen</strong> <strong>zum</strong> <strong>Präsenzmodul</strong> <strong>Algorithmen</strong> <strong>und</strong> <strong>Datenstrukturen</strong><br />

Aufgabe 13 Java-Implementierung des binären Suchbaums<br />

Die Lösung wird Ihnen auf dem BSCW zur Verfügung gestellt.<br />

Aufgabe 14 AVL-Baum<br />

a) Durch das Einfügen des Schlüssels 1 entsteht zunächst folgender Baum:<br />

1<br />

0<br />

2<br />

1<br />

4<br />

7<br />

1 12 0<br />

6<br />

0<br />

1<br />

9<br />

0<br />

Ein binärer Suchbaum ist genau dann ein AVL-Baum, wenn neben jedem Knoten 0,1 oder<br />

-1 steht. An der Wurzel wird die AVL-Ausgeglichenheit verletzt. Da das Einfügen im linken<br />

Teilbaum des linken Teilbaums der Wurzel erfolgt ist, kann sie durch eine Rotation nach<br />

rechts wiederhergestellt werden. Dabei wird der Knoten mit dem Schlüssel 7 nach oben<br />

rotiert <strong>und</strong> zur neuen Wurzel des Baums. Der gesamte Teilbaum mit der Wurzel 12 wird<br />

<strong>zum</strong> linken Teilbaum des Knotens mit dem Schlüssel 15:<br />

1<br />

0<br />

2<br />

1<br />

4<br />

1<br />

6<br />

0<br />

7<br />

0<br />

13<br />

9<br />

15<br />

0<br />

0<br />

2<br />

12<br />

0<br />

13<br />

15<br />

0<br />

0<br />

18<br />

18<br />

-1<br />

-1<br />

19<br />

19 0<br />

0


) Durch das Einfügen des Schlüssels 11 entsteht zunächst folgender Baum (*):<br />

2<br />

0<br />

4<br />

0 12 1<br />

6<br />

0<br />

7<br />

-1<br />

9<br />

-1<br />

11 0<br />

13<br />

15<br />

0<br />

18<br />

Lösung 4/ Seite 2<br />

An der Wurzel wird die AVL-Ausgeglichenheit verletzt. Nun ist das Einfügen im rechten<br />

Teilbaum des linken Teilbaums der Wurzel erfolgt. Eine Rotation nach rechts führt diesmal<br />

nicht <strong>zum</strong> Ziel. Es würde folgender Baum entstehen, bei dem die AVL-Ausgeglichenheit an<br />

der Wurzel wieder verletzt wird:<br />

2<br />

0<br />

4<br />

0<br />

6<br />

0<br />

7<br />

-2<br />

9<br />

-1<br />

12<br />

2<br />

1<br />

11 0<br />

13<br />

15<br />

0<br />

1<br />

18<br />

-1<br />

-1<br />

19<br />

19 0<br />

0


Lösung 4/ Seite 3<br />

Stattdessen muss im Baum (*) die AVL-Ausgeglichenheit durch eine Doppelrotation linksrechts<br />

wiederhergestellt werden. Im ersten Schritt erfolgt eine Rotation nach links im linken<br />

Teilbaum der Wurzel. Dabei wird der Knoten mit dem Schlüssel 12 das neue linke Kind der<br />

Wurzel, <strong>und</strong> der Teilbaum mit der Wurzel 9 wird <strong>zum</strong> rechten Teilbaum des Knotens mit<br />

dem Schlüssel 7:<br />

2<br />

0<br />

4<br />

0<br />

7<br />

6<br />

12<br />

0 13 0<br />

0<br />

9<br />

-1<br />

2<br />

11 0<br />

Im zweiten Schritt erfolgt eine Rotation nach rechts analog zur Teilaufgabe a). Der Knoten<br />

mit dem Schlüssel 12 wird zur neuen Wurzel des Baums, <strong>und</strong> der Teilbaum mit der Wurzel<br />

13 wird <strong>zum</strong> linken Teilbaum des Knotens mit dem Schlüssel 15:<br />

2<br />

0<br />

4<br />

0<br />

7<br />

6<br />

0<br />

0<br />

9<br />

-1<br />

11 0<br />

12<br />

0<br />

15<br />

2<br />

13 0<br />

15<br />

-1<br />

18<br />

18<br />

-1<br />

-1<br />

19<br />

19 0<br />

0


Aufgabe 15 Fibonacci-Heap<br />

Ausgangszustand des Fibonacci-Heaps<br />

Minpointer<br />

45 13 5<br />

36 99 75<br />

79 82<br />

33<br />

61<br />

49<br />

52 91<br />

71<br />

Lösung 4/ Seite 4<br />

insert(42): Erzeugung eines einelementigen Binomialbaumes, der in die Wurzelliste eingehängt<br />

wird. Der Minpointer bleibt unverändert.<br />

Minpointer<br />

45 13 5<br />

36 99 75<br />

79 82<br />

33<br />

61<br />

49<br />

52 91<br />

deleteMin (Schritt 1): Löschen des minimalen Elements <strong>und</strong> Einhängen der Unterbäume dieses<br />

Elements in die Wurzelliste. Eine neue Wurzel verliert die Markierung. Der Minpointer wird ungültig.<br />

Minpointer = NIL<br />

45 13 36 99 75<br />

79 82<br />

33<br />

61<br />

71<br />

49<br />

52 91<br />

deleteMin (Schritt 2): Paarweises Zusammenfassen der Bäume mit Rang 0 unter Beachtung der<br />

Heap-Bedingung.<br />

13 36<br />

45<br />

Minpointer = NIL<br />

42<br />

75<br />

79 99 82<br />

33<br />

61<br />

71<br />

49<br />

52 91<br />

71<br />

42<br />

42


Lösung 4/ Seite 5<br />

deleteMin (Schritt 3): Paarweises Zusammenfassen der Bäume mit Rang 1 unter Beachtung der<br />

Heap-Bedingung.<br />

13<br />

Minpointer = NIL<br />

36 45 75<br />

99<br />

79 82<br />

42<br />

33<br />

61<br />

49<br />

52 91<br />

deleteMin (Schritt 4): Paarweises Zusammenfassen der Bäume mit Rang 2 unter Beachtung der<br />

Heap-Bedingung. Aktualisierung des Minpointers.<br />

36<br />

75 99 79<br />

82<br />

42<br />

Minpointer<br />

13<br />

45<br />

33<br />

61<br />

71<br />

49<br />

52 91<br />

decreaseKey(91,31): Zuerst delete(91) (da der Vater dieses Elements eine Wurzel ist, wird diese<br />

nicht markiert) <strong>und</strong> danach insert(31), also Erzeugung eines neuen einelementigen Binomialbaumes,<br />

der in die Wurzelliste eingehängt wird. Der Minpointer bleibt unverändert.<br />

36<br />

75 99 79<br />

82<br />

42<br />

Minpointer<br />

13<br />

45<br />

33<br />

61<br />

71<br />

52<br />

71<br />

49<br />

31


Lösung 4/ Seite 6<br />

decreaseKey(71,10): Zuerst wird delete(71) ausgeführt, danach insert(10), also Erzeugung eines<br />

neuen einelementigen Binomialbaumes, der in die Wurzelliste eingehängt wird. Da der Knoten mit<br />

dem Schlüssel 52 markiert ist, wird er unmarkiert mit insert(52) in die Wurzelliste eingehängt.<br />

Der Knoten mit dem Schlüssel 49 ist eine Wurzel <strong>und</strong> braucht nicht markiert zu werden. Der<br />

Minpointer wird aktualisiert <strong>und</strong> zeigt nun auf die 10.<br />

52 10<br />

13<br />

33<br />

49 31<br />

36<br />

75 99 79<br />

82<br />

Minpointer<br />

Aufgabe 16 Beispiel für einen (a,b)-Baum<br />

42<br />

a) Durch das Einfügen eines Blattes mit dem Schlüssel 7 entsteht zunächst folgender Baum:<br />

3 5<br />

1 4 6 7 8<br />

45<br />

1 3 4 5 6 7 8 9<br />

Der rechte Teilbaum besitzt nun vier Blätter <strong>und</strong> muss in zwei Bäume aufgeteilt werden.<br />

Die Verwaltungseinheit 7 wandert dabei in die Wurzel:<br />

1 4<br />

1 3 4 5<br />

61<br />

3 5 7<br />

6<br />

6 7<br />

8<br />

8 9


Lösung 4/ Seite 7<br />

Nun hat die Wurzel vier Kinder, so dass der gesamte Baum in zwei Teilbäume aufgeteilt<br />

werden muss. Es wird eine neue Wurzel mit der Verwaltungseinheit 5 erzeugt:<br />

1 4<br />

1 3 4 5<br />

5<br />

3 7<br />

6<br />

6 7<br />

8<br />

8 9<br />

b) Durch das Löschen des Blattes mit dem Schlüssel 4 muss das Blatt mit dem Schlüssel 5<br />

mit anderen Blättern zusammengeschlossen werden. Die erste Möglichkeit ist das Zusammenschließen<br />

mit den Blättern im linken Teilbaum. Dabei wird die Verwaltungsinformation<br />

folgendermaßen aktualisiert: Die Verwaltungseinheit 4 wird gelöscht <strong>und</strong> die Verwaltungseinheit<br />

3 wandert von der Wurzel in das linke Kind:<br />

1 3<br />

5<br />

6 8<br />

1 3 5 6 8 9<br />

Die zweite Möglichkeit ist das Zusammenschließen mit den Blättern im rechten Teilbaum.<br />

Dabei wird die Verwaltungsinformation folgendermaßen aktualisiert: Die Verwaltungseinheit<br />

4 wird gelöscht <strong>und</strong> die Verwaltungseinheit 5 wandert von der Wurzel in das rechte<br />

Kind:<br />

1<br />

3<br />

5 6 8<br />

1 3 5 6 8 9


Lösung 4/ Seite 8<br />

Nun besitzt der rechte Teilbaum vier Blätter <strong>und</strong> muss in zwei Bäume aufgeteilt werden.<br />

Die Verwaltungseinheit 6 wandert dabei in die Wurzel:<br />

1<br />

3 6<br />

5 8<br />

1 3 5 6 8 9

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!