http://www.mpi-sb.mpg.de/~hannah/info5-ws00 IS UN R S WS 2000/2001 E R SIT S Bast, Schömer SA IV A Grundlagen zu Datenstrukturen und Algorithmen A VIE N 8. Übungsblatt Abgabetermin: Dienstag, 19. Dezember 2000 Aufgabe 1 (10 + 15 + 20 Punkte) Gegeben sei ein binärer Suchbaum B zur dynamischen Verwaltung einer Menge von n (paarweise verschiedenen) Elementen vom Typ T , auf dem eine Ordnung besteht. Die Speicherung der Elemente erfolge knotenorientiert. In der Vorlesung wurde gezeigt, dass die Operationen find, insert und erase in Zeit O(Tiefe(B)) ausgeführt werden können. Um zu garantieren, dass Tiefe(B) = O(log n) ist, benutzt man nach dem Einfügen oder Löschen von Elementen oft Rotationen als Technik zur Rebalancierung. Realisieren Sie unter diesen Voraussetzungen folgende zusätzlichen Operationen, indem Sie die Datenstruktur für B entsprechend ergänzen und/oder die obigen Operationen modifizieren (deren Laufzeit dabei aber bei O(Tiefe(B)) bleiben sollte). Ihre Vorgehensweise sollten Sie dabei ausführlich erklären und begründen. (a) Zeigen Sie, wie sich die Operationen minimum und maximum in konstanter Zeit realisieren lassen. (b) Zeigen Sie, wie sich die Operation select(int k) (finde das k-t kleinste Element) in O(log n) Zeit realisieren lässt. Hinweis: Verwalten Sie in jedem Knoten v des Baumes geeignete Zusatzinformationen über den Unterbaum von v. (c) Zeigen Sie, wie sich die Operation int find(T& a, T& b) (ermittelt die Zahl aller Elemente x in B, für die a ≤ x ≤ b) in O(log n) Zeit realisieren lässt. Realisieren Sie eine entsprechende Operation, die eine Liste all dieser Elemente zurückgibt, und bestimmen Sie die Größenordnung ihrer Laufzeit. Aufgabe 2 (10 + 20 + 15 + 10 + 30∗ Punkte) Als eine Anwendung von binären Suchbäumen betrachen wir folgendes Problem: Gegeben sei eine Menge P von paarweise verschiedenen Punkten p1 , p2 , . . . , pn in der Ebene, d.h. jeder Punkt besitzt eine x- und eine y-Koordinate: pi = (xi , yi ) für i = 1, . . . , n. Zu dieser Menge können jederzeit Punkte hinzugefügt oder aus ihr gelöscht werden. Wie üblich bezeichnet der Parameter n die aktuelle Problemgröße, wenn eine Operation ausgeführt wird. Wir wollen eine Datenstruktur zur effizienten Verwaltung dieser Menge von Punkten entwickeln, so dass die Operationen insert, erase und find unterstützt werden. Die Operation int find(float a, float b, float c, float d) soll dabei die Zahl der Punkte ermitteln, die in dem Rechteck liegen, dessen x-Intervall durch a und b und dessen y-Intervall durch c und d gegeben ist. Als primäre Datenstruktur benutzen wir einen binären Suchbaum, in dem die x-Koordinaten der Punkte verwaltet werden. Zusätzlich zur x-Koordinate verwalten wir in jedem Knoten v dieses Baumes einen binären Suchbaum für die y-Koordinaten aller Punkte, deren x-Koordinaten im Unterbaum von v gespeichert sind; diese Bäume (einer pro Knoten im primären Baum) nennen wir die sekundäre Datenstruktur. (a) Schätzen Sie größenordungsmäßig den Platzbedarf für die gesamte Datenstruktur ab. (b) Zeigen Sie, wie sich die Operationen insert und erase in Zeit O(log2 n) realisieren lassen. (c) Zeigen Sie, wie sich die Operation find in Zeit O(log2 n) realisieren lässt. (d) Erklären Sie, warum man in dem sekundären Suchbaum eines Knotens v nicht einfacher (und platzsparender) die y-Koordinaten aller Punkte mit der an v gespeicherten x-Koordinate verwaltet (anstatt, wie oben beschrieben, auch die y-Koordinaten aller Punkte deren xKoordinaten unterhalb von v gespeichert sind). (e) Erklären Sie, wie sich die Problemstellung auf höhere Dimensionen (z.B. Punkte im Raum) verallgemeinern lässt, wie man dann die Datenstruktur erweitern muss, und mit welchem Platzbedarf und mit welchen Laufzeiten man dann für die verschieden Operationen rechnen muss.