DAP2 Heimübung 9

SoSe 2015
C. Sohler
J. Flake, A. Krivo²ija
B. Rudak, V.Volz
DAP2 Heimübung 9
Ausgabedatum: 29.05.15 Abgabedatum: Fr. 05.06. (Mo. 08.06. für Gruppen 26-31) 12 Uhr
Aufgabe 9.1 (5 Punkte):
(AVL-Bäume)
a) Gegeben sei folgender AVL-Baum T .
2
1
10
3
11
Pegen Sie die folgenden Elemente in der angegebenen Reihenfolge in die Datenstruktur
ein:
9, 4, 8, 5, 7, 6
Geben Sie den Baum T nach jeder Operation an. Geben Sie auÿerdem an, an welchem
Knoten und in welche Richtung rotiert wird.
Lösung:
•
Wir fügen 9 ein. Rechtsrotation in 10, Linksrotation in 2.
3
2
•
Wir fügen 4 ein.
1
10
9
1
11
3
2
10
1
9
11
4
• Wir fügen 8 ein. Linksrotation in 4, Rechtsrotation 9.
3
2
10
1
4
• Wir fügen 5 ein. Rechtsrotation in 10.
8
9
3
2
8
1
•
4
Wir fügen 7 ein. Linksrotation in 4.
10
5 9 11
3
2
1
11
8
5
10
4 7 9 11
• Wir fügen 6 ein. Rechtsrotation in 8, Linksrotation in 3.
2
5
3
8
2
4 7
10
6
9 11
1
b) Gegeben sei folgender AVL-Baum T .
0
7
4
9
2
5 8
1 3
6
10
11
Löschen Sie die folgenden Elemente in der angegebenen Reihenfolge in die Datenstruktur
ein:
6, 5, 7, 9
Geben Sie den Baum T nach jeder Operation an. Geben Sie auÿerdem an, an welchem
Knoten und in welche Richtung rotiert wird und durch welches Element das Gelöschte
ersetzt wurde.
0
Lösung:
•
Wir löschen 6.
7
4
9
2
5 8
1 3
10
11
3
•
Wir löschen 5. Rechtsrotation in 4.
7
2
9
1
•
4 8
3
Wir löschen 7. Ersetzen durch 4.
11
4
2
9
1
•
10
3 8
10
Wir löschen 9. Ersetzen durch 8. Linksrotation in 8.
4
2
1
11
10
3 8
11
(Datenstrukturen)
Entwerfen Sie eine Datenstruktur, die alle folgenden Operationen in O(1) unterstützt. In dieser
Aufgabe sind alle Elemente aus dem Wertebereich {1, . . . , k}, und k ist eine Konstante.
Aufgabe 9.2 (5 Punkte):
: Fügt ein Element x in die Datenstruktur ein.
• LöscheNeuestes: Löscht unter allen Elementen in der Datenstruktur das, was zuletzt
eingefügt wurde.
• LöscheÄltestes: Löscht unter allen Elementen in der Datenstruktur das, was am frühesten eingefügt wurde.
• Zähle(x): Gibt zurück, wie oft x aktuell in der Datenstruktur ist.
4
• Einfügen(x)
Beispiel: Nach der Sequenz
Einfügen(8), Einfügen(8), Einfügen(3), Einfügen(8), Einfügen(5), LöscheÄltestes, Zähle(8)
soll die Datenstruktur bei der letzten Operation 2 zurückliefern, da die 8 noch zweimal in der
Datenstruktur ist.
Für die volle Punktzahl wird erwartet, dass alle Operationen eine Worst-Case Laufzeit
von O(1) haben.
Beschreiben Sie in wenigen kurzen Sätzen, wie Ihre Datenstruktur aufgebaut ist und wie die
angegeben Operationen realisiert werden. Hierbei ist kein Pseudocode gefordert. Machen Sie
deutlich, dass die Datenstruktur korrekt arbeitet und alle Operationen Worst-Case-Laufzeit
O(1) haben.
Lösung:
Die gesuchte Datenstruktur ist von eine doppel verkettete Liste A mit Zeigern Head und Tail
auf dem ersten bzw. letzten Element; sowie ein Array B[1..k] gebaut. Da k eine Konstante ist,
ist das möglich zu denieren. Im Feld B[x] des Arrays B wird die Anzahl der Auftretens von
x in A gespeichert. Jedes Element von A hat ein Schlüssel (Wert), und zwei Zeigern prev und
next. Am Anfang ist die Liste A leer (head=tail=null) und B[i] = 0 für alle 1 ≤ i ≤ k .
Jetzt beschreiben wir, wie die verlangten Operationen in der Laufzeit O(1) ausgeführt werden:
• Einfügen(x): Ein Element x wird in die Liste in O(1) eingefügt, so dass der Zeiger tail
jetzt auf x zeigt (O(1)), und B[x] wird um 1 erhöht (O(1)).
• LöscheNeuestes: Wir löschen das letzten Element tail mit dem Schlüssel x =Wert(tail)
(O(1)). Der Zeiger tail wird nach tail→prev aktualisiert (O(1)) und B[x] wird um 1
verringert (O(1)).
• LöscheÄltestes: Wie für LöscheNeuestes, löschen wir das ersten Element head mit dem
Schlüssel x = Wert(head) (O(1)). Der Zeiger head wird nach head→next aktualisiert
(O(1)) und B[x] wird um 1 verringert (O(1)).
• Zähle(x): Da B[x] die Anzahl von x in A enthält, geben wir B[x] zurück (O(1)).
Es ist klar, dass alle angegebene Operationen eine Worst-Case Laufzeit von O(1) haben.
5