Es soll ein Quadtree konstruiert werden, der in jedem inneren Knoten und in jedem Blatt je einen Punkt
einer Punktwolke mit
paarweise verschiedenen Knoten speichert. Der Punkt, der in dem Knoten gespeichert ist, soll die weitere rekursive Aufteilung der zweidimensionalen Ebene vorgeben. Der Quadtree soll erzeugt werden, indem die
gegebenen Punkte zufällig permutiert und dann nacheinander (inkrementell) in den Quadtree eingefügt werden. Geben Sie (in einer objektorientierten Programmiersprache oder in Pseudocode) die Definition der Klasse QuadTree (Knoten des QuadTrees) sowie die Funktion Insert dieser Klasse an. Welche Tiefe kann der Baum im ungünstigsten Fall erreichen? Für welche Art der Eingabe erreicht der Baum diese maximale Tiefe?
Lösung
Ein QuadTree dient in diesem Zusammenhang zur Zerlegung eines zweidimensionalen Gebietes in nichtüberlappende, quadratische Zellen. Der QuadTree muss dazu den folgenden Aufbau haben:

Definition des herkömmlichen QuadTrees
Gegeben ist die Menge
an Punkten und das Quadrat
, das die Punkte enthält. Wenn in der Menge
weniger als zwei Punkte enthalten sind, ist der QuadTree definiert als ein einzelnes Blatt, das den Punkt und das Quadrat speichert. Ansonsten werden die vier Quadranten von
nach ihrer Position benannt: QNW, QNO, QSW, QSO. Die Unterteilung des Quadrates erfolgt genau in der Mitte, dementsprechend entstehen vier neue Punktmengen:
Der QuadTree enthält dann einen Wurzelknoten
, in dem das Quadrat
gespeichert ist. Außerdem enthält er untergeordnet vier neue QuadTrees, die jeweils aus einer der oben beschriebenen neuen Punktmengen gebildet werden.
Definition eines der Aufgabenstellung entsprechenden QuadTrees
Die Punkte werden nacheinander eingefügt. Beim Einfügen eines neuen Punktes wird geprüft, ob der neue Knoten einfach als Blatt an einen bestehenden Knoten angefügt werden kann, oder ob der entsprechende Platz schon belegt ist und daher eine neue Unterteilung durchgeführt werden muss. Der QuadTree ist also definiert als ein Punkt mit den Koordinaten (x, y), der bis zu vier Nachfolger haben kann. Die Unterteilung des Rechtecks erfolgt nicht wie bei dem herkömmlichen QuadTree in der Mitte, sondern genau bei den Koordinaten des Punktes. Der Algorithmus funktioniert also nicht rekursiv (wie oben beschrieben), sondern iterativ.

Die Funktion insert funktioniert wie im der Abbildung oben dargestellt:
für r = 1 bis n Finde das Rechteck, das p_r enthält. wenn das Rechteck nun genau einen Punkt enthält dann füge den neuen Punkt p_r als Blatt an den QuadTree an, der das Rechteck begrenzt sonst // es befinden sich schon Punkt p_m im Rechteck unterteile das Rechteck bei den Koordinaten von p_m und füge den neuen Punkt p_r als Blatt an den QuadTree an, der den Punkt p_m_ enthält.
Maximale Tiefe
Im Gegensatz zum herkömmlichen Quadtree (vergleiche Aufgabe 10) ist die Tiefe des Baumes hier nicht von dem geometrischen Abstand der Punkte abhängig, sondern von ihrer Anordnung und ihrer Anzahl.

Im ungünstigsten Fall sieht der QuadTree so aus wie oben abgebildet. Die Tiefe des Baumes ist dann gleich
, da für jeden Knoten eine Unterteilung durchgeführt werden muss.
Damit der dargestellte Fall eintritt, müssen die Punkte allerdings nicht nur die entsprechende Anordnung haben, sondern sie müssen auch genau in der Reihenfolge von p1 nach oben links in den Graphen eingefügt werden. Eine zufällige Permutation vor dem Einfügen verhindert so etwas und kann daher die Tiefe des Baumes reduzieren (im dargestellten Fall um 50%).






