Kap. 6: Geometrische Algorithmen 6.1 Mehrdimensionale Suchstrukturen Professor Dr. Petra Mutzel Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 23.-26. VO A&D WS 08/09 20./22./27./29.01.2009 Petra Mutzel Alg. & Dat. WS 08/09 1 Überblick: 6.1 Mehrdimensionale Suchstrukturen 6.1.1 Einführung in mehrdimensionale Suchstrukturen 6.1.2 Point-region quad trees 6.1.3 Point quad trees 6.1.4 K-d trees 6.1.5 Range trees Petra Mutzel Alg. & Dat. WS 08/09 2 Literatur: Bücher • M. de Berg, O. Cheong, M. van Krefeld, und M. Overmars: Computational Geometry, Springer 2008, Kap. 5: Orthogonal Range Searching, Kap. 14: Quadtrees • H. Samet: The Design and Analysis of Spatial Data Structures. Addison-Wesley, Reading, MA, 1990 • F. P. Preparata und M. I. Shamos: Computational geometry: an introduction, 1985, Springer, Kap. 2.3 Range-Searching Problems Petra Mutzel Alg. & Dat. WS 08/09 3 Literatur: Paper • R. A. Finkel und J. L. Bentley: Quad trees: A data stucture for retrieval on composite keys, Acta Informatica 4, 1974, S. 1-9 • J. L. Bentley: Multidimensional binary search trees used for associative searching, Communications of the ACM, vol. 18, no. 9, 1975, S. 509-517 • J. L. Bentley and H. A. Maurer: Efficient Worst-Case Data Structures for Range Searching, Acta Informatica, vol. 13, no. 2, 1980, S. 155-168 • G.S. Lueker: A data structure for orthogonal range queries, Proc. 19th Annual IEEE Symposium on Foundations of Computer Science, 1978, S. 28-34 Petra Mutzel Alg. & Dat. WS 08/09 4 6.1.1 Einführung in mehrdimensionale Suchstrukturen • Gegeben: – Menge S von N Punkten in Rk – Familie U von Untermengen von Rk (Ranges) – δ∈U • Gesucht: – Vorverarbeitung von S, so dass Abfragen der Art: ``Berichte alle Punkte in S∩δ´´ effizient berichtet werden können. • Beispiel: Datenbankabfragen Petra Mutzel Alg. & Dat. WS 08/09 5 Anwendungsbereiche • • • • • • • • • Datenbanken Computergraphik / Computer Vision Computer-Aided Design Geographische Informationssysteme Bildverarbeitung Mustererkennung Document-Retrieval Data Mining ... Petra Mutzel Alg. & Dat. WS 08/09 6 Charakterisierung (1) • Welche Datentypen werden gespeichert? – S ist ungeordnete Menge (z.B. Index) – S ist kartes. Produkt S1х S2 х...х Sk geordn. Mengen • Dimension: – k ist kleiner gleich 10 • Operationen: – Find, Insert, Delete, (Pred., Succ., Min, Max) • Welche Speichermedien? – intern vs. extern Petra Mutzel Alg. & Dat. WS 08/09 7 Charakterisierung (2) • Welche Objekttypen werden gespeichert? – Punkte, Container (z.B. Quader in 3D), komplexere – Lage fixiert oder beweglich? • Welche Abfragen und wie oft? – Ist Punkt enthalten? – Aufzählung aller Punkte, die in gewünschtem k-dim. Bereich liegen – Welche Punkte liegen in der Nähe eines Punktes? – Finde die n nächsten Nachbarn eines Punktes – Exakte vs. partielle Abfragen – Einmalige vs. viele Abfragen Petra Mutzel Alg. & Dat. WS 08/09 8 Wir betrachten folgende Abfragen: • Punkt-Abfrage (Point Query): – Ist ein gegebener Datenpunkt in S∈Rk enthalten, und falls ja, dann finde diesen. • Bereichsabfrage (Range Query): – Berichte alle Punkte aus S, deren k Schlüssel in den gewünschten Bereichen liegen. • Orthogonale (bzw. rechteckige) Bereichsabfrage: – Wie Bereichsabfrage und zusätzlich ist der Bereich rechteckig Petra Mutzel Alg. & Dat. WS 08/09 9 Einfache Datenstrukturen • Sequentielle Liste – Aufwand: O(N k) • Invertierte Liste (Knuth 1973) – Sortierte Liste pro Schlüssel – Durchschnittlicher Aufwand: O(N1-1/k) – Aufwand: O(N k) Petra Mutzel Name X-key Y-key D 5 45 C 35 40 O 25 35 M 50 10 X-key Y-key D M O O C C M D Alg. & Dat. WS 08/09 10 ``Fixed Grid´´ Methode • Suchraum wird in gleiche Teile (Buckets) der Größe r aufgeteilt, wobei r der Suchradius ist • Realisiert als k-dim. Array mit einem Eintrag per Bucket; jeder Bucket enthält Punkte in Form einer einfachen Liste • Durchschnittlicher Suchaufwand für Bereichssuche (Bentley 1977): O(F 2k), wobei F die Anzahl der berichteten Punkte ist • Effizient, wenn fixer Radius und Datenpunkte gleichmäßig im Raum verteilt sind (Kartographie) • Teilt den Raum auf Petra Mutzel Alg. & Dat. WS 08/09 11 „Trie“ Region Quadtrees • Repräsentation eines 2-dim. Binärbildes (Region Data) • Rekursive Teilung eines 0/1-Bereiches in vier gleich große Quadranten, STOP falls Block nur 0 oder nur 1 enthält • Suchbaum mit Grad 4 (s. Beispiel) • Jedes Kind eines Knotens repräsentiert Quadranten (NW,NE,SW,SE) • Blätter → Aufteilung nicht weiter notwendig • Blätter sind entweder ``weiß´´ oder ``schwarz´´, innere Knoten sind ``grau´´ Petra Mutzel Alg. & Dat. WS 08/09 12 6.1.2 Point-Region Quadtrees voneines Punkten in einem k-dim. Bereich • Repräsentation Repräsentation 2-dim. Binärbildes (Region Data) • Rekursive Teilung eines quadratischen 0/1Bereiches in vier gleich große Quadranten, STOP falls Block nur 0 oder nur 1 Punkt enthält • Jedem Feld wird ein Knoten in einem Suchbaum mit Maximal- Grad 4 zugeordnet • Jedes Kind eines Knotens repräsentiert Quadranten (NW,NE,SW,SE) • Blätter ← Aufteilung nicht weiter notwendig • Blätter sind entweder ``weiß´´ (falls kein Punkt enthalten ist) oder ``schwarz´´ (sonst), innere Knoten sind ``grau´´ Petra Mutzel Alg. & Dat. WS 08/09 13 (0,100) (100,100) k=2 Point-Region Quadtrees: Beispiel N=10 Punkte y (0,0) x (100,0) PR Quadtree für Beispiel (50,50) (75,75) (25,25) Petra Mutzel (75,25) Alg. & Dat. WS 08/09 15 k=2: Aufbau eines PR Quadtrees Top-Down Aufbau: • Starte mit Feld B, das alle Knoten enthält • Sei vB der zugehörige Knoten im Suchbaum • Falls B mehr als einen Knoten enthält, dann – erzeuge 4 Kinder von vB im Suchbaum – weise jedem Kind-Feld Bi alle Knoten aus B zu, welche in Bi enthalten sind – entferne leere Kind-Felder vBi im Baum Alternativ: Insert-Aufbau: • Starte mit leerem Feld B und füge iterativ die Knoten ein • Einfügen geht ähnlich wie bei binären Suchbäumen: suche das richtige Feld, Suche endet an Blatt, füge ein. „Z-Order, DFS-Order“ Morton Order [Morton 1966] space filling curve: bildet einen k-dimensionalen Bereich auf eine Dimension ab Abb. aus Wikipedia Laufzeit ? Baum hat Tiefe N → Laufzeiten beider Aufbau-Algorithmen: O(N2) (0,100) (100,100) 1 1 2 y 2 3 3 5 (0,0) 4 x (100,0) 4 5 6.1.3 Point Quad Trees • Eingeführt von Finkel & Bentley 1974 • Multidimensionale Verallgemeinerung von binären Suchbäumen • Verheiratung von ``Fixed Grid´´ mit binären Suchbäumen • Rekursive Teilung an Datenpunkten in jeweils vier Teile: NW,NE,SW, SE • Hier Annahme: – k=2, Verallg. einfach – Jeder Punkt wird nur einmal besetzt Petra Mutzel Alg. & Dat. WS 08/09 19 Beispiel: G H K F D J C B L I E A M N Point Quadtree zu Beispiel A J K F L H G M B D C I E N Point Quad Trees: Operation Insert • Jeder innere Knoten enthält – Zeiger zu Kindern NW,NE,SW,SE – CHILD(P,I): gibt Kind im Quadranten I von Knoten P an – XCOORD, YCOORD: Koordinaten von Punkt – NAME: Information über Punkt (z.B. Name) • Ähnlich wie für binäre Suchbäume: – Suche den Punkt (nach x und y-key) – Wenn Blatt erreicht ist, dann bestimme Position, an die eingefügt werden muss. Petra Mutzel Alg. & Dat. WS 08/09 22 Beispiel: Insert Z G H K F D J B L Z C I E A M N Petra Mutzel Alg. & Dat. WS 08/09 23 Point Quadtree zu Beispiel: Insert Z A J K F L H G M B D C I E Z N Point Quadtrees: Analyse Aufbau • Aufbau eines Point Quadtrees: – Aufwand ist äquivalent zur Gesamtpfadlänge = Kosten, um nach allen Elementen einmal zu suchen • Gesamtpfadlänge: – Hängt von Reihenfolge der Einfügungen der Punkte ab – Empirisch: N log4 N (Finkel & Bentley) – Worst Case: θ(N2) • Aufwand für Insert und Search – Empirisch: O(log4 N) – Worst Case: O(N) – Re-Balancing Methoden sind möglich Petra Mutzel Alg. & Dat. WS 08/09 27 Point Quadtrees: Deletion • Problem: – Geht nicht so leicht wie bei binären Suchbäumen – Beispiel: Entfernung von A Petra Mutzel Alg. & Dat. WS 08/09 28 Beispiel: Deletion Delete A: G H K F D J C B L I E A M N Beispiel: Deletion Delete A: G H K F D J C B L I E A M N Point Quadtrees: Deletion • Problem: – Unterbäume des gelöschten Knotens müssen eventuell neu eingefügt werden, denn sie sind nicht mehr im richtigen Quadranten bzgl. der neuen Wurzel – Original-Vorschlag war daher: alle diese Unterbäume neu einfügen – Besser: Vorschlag von Samet: Petra Mutzel Alg. & Dat. WS 08/09 31 Point Quadtrees: Deletion • Problem: – Unterbäume des entfernten Knotens müssen neu eingefügt werden – Alle Knoten mit deren Unterbäumen, die in der Zwischenregion liegen, müssen neu eingefügt werden. • Idee: – Wähle in jedem Unterquadranten des zu entfernenden Knotens einen Kandidaten aus, der am nächsten bei x oder y-Koordinate ist. – Wähle aus diesen vier Kandidaten dann den besten aus. Petra Mutzel Alg. & Dat. WS 08/09 32 Wunsch: Finde einen Punkt Z, so dass die Zwischen-RegionBeispiel: def. durch Z und A leer ist G H K F D J C B L I E A M N Petra Mutzel & Dat. WS 08/09 Problem: Z muss nichtAlg.existieren! 33 Deletion: FIND_CANDIDATE(P,Q) Pointer node procedure FIND_CANDIDATE(P,Q) // P pointer to the son in quadrant Q of the node to be deleted. // // OPQUAD(Q) gives quadrant 180 degrees apart from Q // 1. begin 2. if not(null(P)) 3. while not(null(CHILD(P,OPQUAD(Q)))) do 4. P CHILD(P,OPQUAD(Q)); 5. return(P); 6. end; Petra Mutzel Alg. & Dat. WS 08/09 34 Kriterium 1: Wähle denjenigen, der am nächsten Beispiel: Kandidaten bei A liegt bzgl. x und y nach Punkt mit Kriterium 1 muss nicht existieren: Bsp FIND_CAND G H K F D J C B L I E A M N Kriterium 1 garantiert, dass Zwischenregion leer ist Kriterium 1: Wähle denjenigen, der am nächsten bei A liegt bzgl. x und y Kriterium 2 (NEU): Wähle denjenigen Punkt i mit kleinstem Punkt 1 muss nichtmin existieren: Bsp Abstandmit zu Kriterium einer Koordinatenachse: (|xi-x|,|yi-y|) Beispiel: Kandidaten nach FIND_CAND y G H K D J C B L A M F I E x Denn: Punkt im Quadranten gegenüber liegt sicher nicht in Zwischenregion und mind. ein anderer Punkt ist auch außerhalb. Kriterium 1 garantiert, dass Zwischenregion leer ist N Kriterium 2 garantiert, dass höchstens ein anderer Kandidat innerhalb der Zwischenregion liegt Point Quadtrees: Deletion - Vorgehen • Sei P der zu entfernende Punkt, R ist Wurzel • Falls P kein oder nur ein Kind hat: einfach • Sonst: – Bestimme die vier Kandidaten pro Quadrant – Bestimme den besten Kandidaten nach Kriterien 1,2 – Sei J bester Kandidat, J liegt in Quadrant Q bzgl. P: – Kopiere xcoord, ycoord, name – Rekursiver Umbau des nächsten Quadranten im Uhrzeigersinn CQUAD(Q) mit Hilfe von ADJQUAD() – Rekursiver Umbau des nächsten Quadranten im Gegenuhrzeigersinn CCQUAD(Q) mit Hilfe von ADJQUAD() – Rekursiver Umbau des Quadranten Q mit Hilfe von NEWROOT() Delete Punkt A Beispiel: G H K F D J C B L I E A M N Beispiel nach Deletion von A G H K D J L F C B E I M N Quadtree zu Beispiel nach Deletion von A B F J K D H G N M C L Petra Mutzel E Alg. & Dat. I WS 08/09 43 Point Quadtree vor Delete A A J K F L H G M B D C I E N Point Quadtrees: Analyse Deletion • Theoretisch (Bentley 1988): – Aufwand bei gleichmäßig verteilten Daten für die Anzahl der Neueinfügungen geht um 83% zurück gegenüber der Neueinfügung aller Teilbäume. • Empirisch (Bentley 1988): – Empirisch: N log4 N vs. deutlich größer in Original – Gesamtpfadlänge verringert sich leicht vs. deutlich Verlängerung in Original • Worst Case: – O(N2) • Deletion sehr komplex! • Alternative: Pseudo Quadtrees Petra Mutzel Alg. & Dat. WS 08/09 51 Pseudo Quadtrees • Overmars und van Leeuwen 1982 • Idee: – Rekursive Aufteilung des Raumes an Punkten, die nicht Datenpunkte sind, in Quadranten, Unterquadranten, etc., bis jeder Unterquadrant höchstens einen Datenpunkt enthält. Petra Mutzel Alg. & Dat. WS 08/09 52 Pseudo Quadtrees: Beispiel (0,100) (100,100) (60,75) TORONTO 70,70 y (80,65) BUFFALO (40,50) (35,40) (5,45) DENVER CHICAGO (25,35) (26,37) OMAHA (0,0) (85,15) ATLANTA (65,12) (50,10) Mobile x (90,5) MIAMI (100,0) Pseudo Quadtree für Beispiel (40,50) (70,70) TORONTO BUFFALO (26,37) (65,12) OMAHA DENVER CHICAGO Petra Mutzel ATLANTA MIAMI MOBILE Alg. & Dat. WS 08/09 54 Pseudo Quadtrees: • Aufbau: – Für je N Datenpunkte im k-dim. Raum existiert ein Partitionierungspunkt, so dass jeder Quadrant höchstens ┌N/(k+1)┐ Datenpunkte enthält. • Analyse: – Dann besitzt der Pseudo Quadtree eine Tiefe von höchstens ┌logk+1N┐ und kann in Zeit O(N logk+1N) gebaut werden. Petra Mutzel Alg. & Dat. WS 08/09 55 Point Quadtrees: Diskussion • Nachteile bei höheren Dimensionen: – An jedem Knoten des Baumes sind k Vergleiche notwendig (um den Quadranten zu bestimmen) – Hoher Speicherplatzverbrauch: Jedes Blatt benötigt k viele NULL Pointer, auch jeder innere Knoten besitzt immer wieder NULL Pointer – Speicherplatzverbrauch pro Knoten: k+2k+1 Wörter für Koordinaten, Kinder und Info Petra Mutzel Alg. & Dat. WS 08/09 56 6.1.4 K-D Trees Ursprünglich bedeutete 2-d tree: „2-dimensional tree“ Heute aber ist k-d tree (oder auch kd-tree) ein feststehender Begriff und man sagt: „2-dimensional k-d tree“ • Jon Louis Bentley 1975 • Idee: – Binärer Suchbaum mit der Eigenschaft, dass in jeder Tiefe nach einer anderen Dimension orthogonal aufgeteilt wird. – Z.B. k=2: nach x-Koordinaten auf den Schichten mit gerader Nummer (Beginn bei Schicht 0), nach yKoordinaten auf den ungeraden Schichten. – Aufteilung basiert auf den Datenpunkten – BSP Trees (Fuchs, Kedem, Naylor 1980): K-D Trees, bei denen nicht orthogonal aufgeteilt wird Petra Mutzel Alg. & Dat. WS 08/09 57 K-D Tree: Beispiel (0,100) (100,100) (60,75) TORONTO y (80,65) BUFFALO (5,45) DENVER (25,35) OMAHA (0,0) (85,15) (35,40) ATLANTA CHICAGO (50,10) Mobile (90,5) MIAMI x (100,0) Aufbau von K-D Trees: BuildKDTree(P,depth) Annahme: alle Koordinaten sind verschieden! 1. Falls P nur einen Punkt enthält dann 2. Return ein Blatt, das diesen Punkt enthält 3. Sonst Falls (depth mod 2 == 0) dann 4. Splitte P in 2 Teilmengen mittels einer vertikalen Linie l durch die x-Median-Koordinate von P. Sei P1 die Menge der Punkte links von l oder auf l, und P2 rechts von l. 5. Sonst Splitte P ... horizontalen Linie ... 6. Pleft = BuildKDTree(P1,depth+1) 7. Pright = BuildKDTree(P2,depth+1) 8. Erzeuge einen Knoten v, der l speichert mit vleft als linkes Kind und vright als rechtes Kind von v 9. Return v Analyse des Aufbaus • Der Median wird hier als die n/2-kleinste Zahl berechnet (so dass der Median von zwei Werten dem kleineren entspricht). • Um die Medianfindung zu erleichtern, werden die Punkte vorher einmal nach x-Koordinate und einmal nach yKoordinate sortiert. • Lemma: Annahme: Alle x- und y-Koordinaten sind paarweise verschieden. Dann benötigt ein k-d tree für N Punkte O(N) Speicherplatz und kann in Zeit O(N log N) aufgebaut werden. Petra Mutzel Alg. & Dat. WS 08/09 60 K-D Tree: Einfügen (0,100) (100,100) (60,75) TORONTO (80,65) BUFFALO Z y (5,45) DENVER (25,35) OMAHA (0,0) (85,15) (35,40) ATLANTA CHICAGO (50,10) Mobile (90,5) MIAMI x (100,0) K-D Trees: INSERT • Analog zu binären Suchbäumen: – Wir suchen den Punkt abwechselnd basierend auf den k Schlüsseln – Wenn das Blatt erreicht ist, haben wir die EinfügePosition gefunden • Analyse: – Form des Baumes hängt von Einfügereihenfolge ab – Durchschnittliche Tiefe: O(log2 N) – Worst Case Tiefe: O(N), Aufbau: O(N2) – Optimierung ähnlich wie bei Quad Trees – Alternative: Adaptive K-D Tree Petra Mutzel Alg. & Dat. WS 08/09 62 Adaptive K-D Trees • Idee: – Wie K-D Trees, ausser, dass die Aufteilung zwischen (statt an) den Datenpunkten gemacht wird – Datenpunkte werden nur in den Blättern gespeichert – Jeder innere Knoten enthält den Median der Menge der noch übrigen, in diesem Teil befindlichen Knoten (bzgl. einem Schlüssel) – Aufteilung nicht mehr abwechselnd nach Schlüsseln, sondern nach dem Schlüssel, der noch die größte Differenz zwischen min und max besitzt. Petra Mutzel Alg. & Dat. WS 08/09 63 Adaptiver K-D Tree: Beispiel (0,100) (100,100) (60,75) TORONTO y (5,45) DENVER (25,35) OMAHA (0,0) (80,65) BUFFALO (35,40) CHICAGO (50,10) Mobile x Petra Mutzel (85,15) ATLANTA (90,5) MIAMI (100,0) Alg. & Dat. WS 08/09 64 Adaptive K-D Trees • Diskussion: – Ist nicht notwendigerweise balanciert – Statische Datenstruktur (alle Punkte müssen vorher bekannt sein, sonst nicht sinnvoll) – Deletion ist sehr komplex – Suchen: ähnlich wie bei K-D Trees Petra Mutzel Alg. & Dat. WS 08/09 65 K-D Trees Deletion • Datenstruktur: – LEFT, RIGHT: linkes und rechtes Kind – XCOORD, YCOORD, ... – NAME – DISC: Diskriminator bzgl. k-tem Schlüssel – Abmachung für Diskriminatoren: gleiche Schlüsselwerte wie der Diskriminator befinden sich im rechten Teilbaum Petra Mutzel Alg. & Dat. WS 08/09 66 K-D Trees: Deletion • Diskussion (k=2): – Deletion ist nicht so leicht wie bei binären Suchbäumen – Problem: nach Entfernung von Knoten aus Baum stimmen die Diskriminatoren nicht mehr (z.B. 2 Mal xKoordinaten hintereinander) • Idee: Rekursiv: – DELETION(a,b) – Finde Ersatzknoten (c,d) in einem Unterbaum – Überschreibe (a,b) mit (c,d) – DELETION(c,d) Petra Mutzel Alg. & Dat. WS 08/09 67 K-D Trees: Deletion • Kandidaten für Ersatzknoten: – Sei (a,b) x-Diskriminator, dann: – (1) Entweder Knoten im linken Teilbaum mit größter xKoordinate – (2) Oder Knoten im rechten Teilbaum mit kleinster xKoordinate – (1) scheidet aus wegen Abmachung bzgl. gleicher Schlüsselwerte, denn – Annahme: sei (c,d) aus linkem Teilbaum, dann könnte ein anderer Knoten (c,z) in linkem Teilbaum existieren Petra Mutzel Alg. & Dat. WS 08/09 68 K-D Trees: Deletion • Kandidaten für Ersatzknoten: – Sei (a,b) x-Diskriminator, dann ist Kandidat: – Knoten im rechten Teilbaum von a mit kleinster x-Koordinate • Problem: rechter Teilbaum von (a,b) ist leer • Lösung: – Finde Knoten (c,d) mit kleinster x-Koordinate in linkem Teilbaum von (a,b) – ersetze (a,b) durch (c,d) – der linke Teilbaum von (a,b) wird jetzt rechter Teilbaum von (a,b) (bzw. neu (c,d)) – Rekursiver Aufruf von DELETION(c,d) Petra Mutzel Alg. & Dat. WS 08/09 69 Beispiel Deletion in K-D Tree (0,60) Entfernen von A(20,20) (60,60) C(25,50) G(55,40) E(30,45) H(45,35) B(10,30) F(30,35) I(50,30) y D(35,25) A(20,20) (0,0) x (60,0) Beispiel Deletion in K-D Tree Entfernen von A(20,20) X (20,20) Y (10,30) (25,50) X (35,25) Y (30,45) (55,40) (45,35) X (30,35) vorher (50,30) Petra Mutzel nachher Alg. & Dat. WS 08/09 71 K-D Trees: Deletion • Problem reduziert auf: • Bestimme den Knoten mit kleinster x- bzw. y-Koordinate in Teilbaum von (a,b): – Muss im linken Teilbaum eines x-Diskriminators sein – Kann im linken oder rechten Teilbaum eines yDiskriminators sein • Analyse: – Dieser Aufwand kann in k-dim.k-d Bäumen O(N1-1/k) betragen • Deletion eines Knotens in k-dim. k-d Bäumen kann Zeit O(N1-1/k) dauern. Experimentell dauert Deletion in zufälligen k-d trees jedoch nur O(log N). K-D Trees: Bereichssuche • Orthogonale Bereichssuche: Ausgabe aller Knoten (x,y) die sich innerhalb eines rechteckigen Gebiets R befinden Der Algorithmus funktioniert aber genauso bei beliebigen Regionen, z.B. • Ausgabe aller Knoten (x,y), die sich innerhalb des Gebietes mit Radius d (euklidisch) um (a,b) befinden,d.h. (a-x)2+(b-y)2≤d2 Petra Mutzel Alg. & Dat. WS 08/09 76 Beispiel Bereichssuche in K-D Tree (0,100) (100,100) (60,75) TORONTO y (80,65) BUFFALO (5,45) DENVER (25,35) OMAHA (0,0) (85,15) (35,40) ATLANTA CHICAGO (50,10) Mobile (90,5) MIAMI x (88,6), d=3 (100,0) Beispiel Orthogonale Bereichssuche in K-D Tree Y E B S W P R D A G Q V C H F I x Petra Mutzel Alg. & Dat. WS 08/09 78 Bereichssuche in K-D Tree • Idee: Jeder Knoten v eines k-d tree entspricht einer Region R(v) in der Ebene, z.B. Wurzelknoten: die ganze Ebene, das linke Kind entspricht der linken Halbebene, dessen Kinder dem unteren/oberen Quader, ... etc. • Ein Punkt P ist genau dann im Unterbaum mit Wurzel v wenn P in R(v) liegt. • Traversiere also den k-d tree, besuche nur Knoten, deren Region sich mit dem gesuchten Bereich schneidet. • Falls eine Region ganz im Bereich enthalten ist, können alle Punkte des dazugehörigen Unterbaums ausgegeben werden ohne weiter in den Baum hinabzusteigen. Petra Mutzel Alg. & Dat. WS 08/09 79 Bereichssuche in K-D Tree Algorithmus SearchKDTree(v,R*) 1. Falls v ist ein Blatt dann 2. Falls der Punkt in R* liegt: Ausgabe 3. Sonst 4. Falls R(LEFT(v)) ganz in R* enthalten ist dann 5. Ausgabe aller Punkte in LEFT(v) 6. Sonst 7. 8. 9. 10. Falls R(LEFT(v)) ∩ R* ≠ ∅ dann SearchKDTree(LEFT(v),R*) Falls Falls R(Right(v)) ganz in R*... // (4-8 wie oben aber // mit RIGHT) Petra Mutzel Alg. & Dat. WS 08/09 80 Analyse Bereichssuche Lemma: Eine orthogonale Bereichsabfrage in einem ausgeglichenen k-d tree mit N Punkten geht in Zeit O(N½ + F), wobei F die Anzahl der ausgegebenen Punkte ist. Beweisidee: Jede vertikale Linie schneidet bis zu O(N½) Regionen in einem k-d tree. • Deletion für den k-dimensionalen Fall: – Worst Case für vollständigen k-d Tree: – O(k N1-1/k) Petra Mutzel Alg. & Dat. WS 08/09 81 Diskussion K-D Trees • An jedem Knoten muss nur jeweils ein Schlüsselvergleich durchgeführt werden. • Speicherplatz: – Blätter: es gibt nur maximal zwei NULL-Pointer – Benötigter Speicherplatz pro innerer Knoten: 1+1+1+1+k für LEFT, RIGHT, NAME, DISC + k Wörter für k Schlüssel • Adaptive K-D Trees: – Innere Knoten benötigen nur 5 Wörter • Nachteil gegenüber Quadtree: – Quadtree ist eine parallele Datenstruktur (k Schlüsselvergleiche), K-D Trees nicht Petra Mutzel Alg. & Dat. WS 08/09 82 6.1.5 Range Trees • „Bereichsbäume“, Bentley und Maurer 1979/80 • speichert Punkte und wurde dafür optimiert, alle Punkte zu finden, die in einem gegebenen Bereich liegen • Idee für k=2: Annahme: alle Koordinaten sind verschieden – Binärer Suchbaum, der aus binären Suchbäumen besteht – Sortiere alle Punkte nach x-Koordinate und speichere diese als Blätter in balanciertem binärem Suchbaum T (main tree) – Jeder innere Knoten I wird mit Punktmenge Pi assoziiert, die zum Teilbaum von T mit Wurzel I gehören – Jeder innere Knoten I zeigt auf einen 1-dim. range tree Ti , der alle Punkte Pi enthält und nach y sortiert ist. Petra Mutzel Alg. & Dat. WS 08/09 83 1-dimensionaler Range Tree • Ein 1-dimensionaler range tree ist ein balancierter binärer Suchbaum mit den Datenpunkten in den Blättern. • Dabei sind die Blattknoten untereinander zusätzlich doppelt verkettet verlinkt. • 1-dimensionale Bereichssuche [L:R]: Suche den kleinsten Wert ≥L und folge den Verlinkungen auf Blattebene solange bis Wert >R ist. • Analyse der Suchzeit: O(log N + F), bei N Punkten im Suchbaum und Ausgabe von F Punkten. • Speicherplatz: O(N) • Aufbau: O(N), falls die Punkte sortiert sind, sonst O(N log N) Petra Mutzel Alg. & Dat. WS 08/09 84 Beispiel: [L:R]=[18:77] Q pR pL Petra Mutzel Alg. & Dat. WS 08/09 85 Alternative Suche nach [L:R] im 1-dimensionalen Range Tree • Annahme: Blattknoten von T sind diesmal nicht untereinander verlinkt. • Die Suche nach L ende an Blatt pL, die Suche nach R an pR • Sei Q (innerer Knoten) der nächste gemeinsame Vorgänger von pL und pR in T • Bezeichne {Li} und {Ri} die Sequenzen der Knoten auf dem Weg von Q nach pL bzw. pR. • Für jeden Knoten P aus {Li} für den auch LEFT(P) aus {Li} ist: Ausgabe aller Knoten im Teilbaum mit Wurzel RIGHT(P) • Für jeden Knoten P aus {Ri} für den auch RIGHT(P) aus {Ri} ist: Ausgabe aller Knoten im Teilbaum mit Wurzel LEFT(P). Petra Mutzel Alg. & Dat. WS 08/09 86 Algorithmus SEARCH [L:R] in 1-d range tree 1. Q = FindSplitNode (T,L,R) // der nächste gemeinsame Vorgänger von pL und pR in T 2. Falls Q ein Blatt ist: Falls Punkt in [L:R], dann Ausgabe STOP 3. Sei P=LEFT(Q) 4. Solange P kein Blatt ist: 5. Falls xkey(P)≥L dann 6. ReportSubtree(RIGHT(P)) 7. P=LEFT(P) 8. Sonst P=RIGHT(P) 9. Teste, ob Blatt P ausgegeben werden muss 10. Sei P=RIGHT(Q) und wiederhole 4-9 für P mit vertauschten Rollen für LEFT und RIGHT. Funktion FindSplitNode(T,L,R) 1. P=root(T) 2. Solange P kein Blatt ist AND (xkey(P)<L OR xkey(P)≥R) 3. Falls xkey(P)≥R dann 4. P=LEFT(P) 5. Sonst P=RIGHT(P) 6. Return P Beispiel: [L:R]=[18:77] Q pR pL Petra Mutzel Alg. & Dat. WS 08/09 89 Bereichssuche nach [Lx:Rx][Ly:Ry] im 2-dim. Range Tree • Die Suche im main tree nach Lx ende an Blatt pL, die Suche nach Rx an Blatt pR • Sei Q (innerer Knoten) der nächste gemeinsame Vorgänger von pL und pR in T • Bezeichne {Li} und {Ri} die Sequenzen der Knoten auf dem Weg von Q nach pL bzw. pR. • Für jeden Knoten P aus {Li} für den auch LEFT(P) aus {Li} ist: starte 1-dim. Bereichssuche nach y für [Ly:Ry] im Suchbaum, auf den RIGHT(P) zeigt. • Für jeden Knoten P aus {Ri} für den auch RIGHT(P) aus {Ri} ist: starte 1-dim. Bereichssuche nach y für [Ly:Ry] im Suchbaum, auf den LEFT(P) zeigt. Petra Mutzel Alg. & Dat. WS 08/09 90 Algorithmus SEARCH [L [L:R] x:Rx][Ly:Ry] in 1-d 2 range tree 1. Q = FindSplitNode (T,L,R) Lx,Rx // der nächste gemeinsame Vorgänger von pL und pR in T 2. Falls Q ein Blatt ist: Falls Punkt in [L:R], [Lx:Rx] [Ly:Ry] dann Ausgabe STOP 3. Sei P=LEFT(Q) 4. Solange P kein Blatt ist: 5. Falls LLx ≤ xkey(P) dann 6. ReportSubtree(RIGHT(P)) 1DRangeQuery(T(RIGHT(P)),[Ly:Ry]) 7. P=LEFT(P) 8. Sonst P=RIGHT(P) 9. Teste, ob Blatt P ausgegeben werden muss 10. Sei P=RIGHT(Q) und wiederhole 4-9 für P mit vertauschten Rollen für LEFT und RIGHT. Beispiel: [L:R]=[18:77][Ly,Ry] Q 1DRangeTree (30,37,49) 1DRT (59,62) Teste, ob Blatt1DRangeTree(23) ausgegeben werden muss Petra Mutzel 1DRangeTree(70) Teste, ob Blatt ausgegeben werden muss Alg. & Dat. WS 08/09 92 Analyse der Bereichssuche im 2-dim. Range Tree Lemma: Eine Bereichssuche im 2-dim. Bereich [Lx:Rx] [Ly:Ry] geht in einem 2-dim. range tree, der N Punkte enthält, in Zeit O(log2 N+F), wobei F die Anzahl der ausgegebenen Punkte ist. Beweis: Ein Aufruf von 1DRangeQuery(T(RIGHT(P)), [Ly:Ry])in Punkt P geht in Zeit O(log N+FP), wobei FP die Anzahl der von diesem Aufruf ausgegebenen Punkte bezeichnet. Abgesehen davon ist die Laufzeit des Algorithmus in jedem besuchten Knoten P konstant. Insgesamt ergibt dies: ∑O(log N+FP), wobei die Summe über alle besuchten Knoten P läuft; diese sind durch O(log N) beschränkt. Weiterhin gilt ∑FP =F. Insgesamt ergibt dies Zeit O(log2 N+F). Petra Mutzel Alg. & Dat. WS 08/09 93 Aufbau eines 2-dim. Range Tree: Algorithmus Build2DRangeTree(P) 1. Konstruiere einen balancierten binären Suchbaum Tass auf der Menge Py, der y-Koordinaten aller Punkte in P. Speichere an den Blättern auch die Punkte selbst. 2. Falls P nur aus einem Punkt besteht, dann 3. generiere ein Blatt v mit diesem Punkt und verlinke auf Tass 4. Sonst: Splitte P in zwei Mengen Pleft und Pright, wobei Pleft alle Punkte mit xCOORD ≤ xmedian enthält 5. vleftBuild2DRangeTree(Pleft) 6. vrightBuild2DRangeTree(Pright) 7. Generiere einen Knoten v, der xmedian enthält, mache vleft zum linken Kind von v, vright zum rechten Kind von v und verlinke auf Tass Analyse des Speicherplatzes • Lemma: Ein 2-dim. range tree T mit N Punkten benötigt O(N log N) Speicherplatz. • Beweis: Ein Punkt p wird genau dann in Tass gespeichert, wenn er im main tree auf dem Weg von der Wurzel zu dem Blatt, das p enthält, liegt. • Für alle Knoten v im main tree einer gegebenen Tiefe gilt: diese werden in genau einem Tass dieser Tiefe gespeichert. Alle Knoten einer Tiefe benötigen also insgesamt Speicherplatz O(N). • Weil die Tiefe im main tree durch O(log N) beschränkt ist, ergibt dies insgesamt O(N log N) Speicherplatz. Petra Mutzel Alg. & Dat. WS 08/09 95 Analyse des Aufbaus • Lemma: Der Aufbau eines 2-dim. range tree mit N Punkten benötigt O(N log N) Zeit. • Beweis: Wir halten die Menge der Punkte einmal nach x-Koordinaten und einmal nach y-Koordinaten sortiert. • Ersteres erlaubt konstanten Zugriff auf den Median (Z.4) und letzteres erlaubt den Aufbau des balancierten Suchbaumes Tass mit N Punkten in linearer Zeit O(N). • Weiterhin gelten die gleichen Argumente wie beim Lemma davor. Petra Mutzel Alg. & Dat. WS 08/09 96 Range Trees in k≥2 Dimensionen • Idee – Konstruiere einen balancierten binären Suchbaum T1 bezüglich der 1.-ten Koordinate – Jeder innere Knoten P besitzt einen Zeiger auf einen (k-1)-dimensionalen range tree; – dieser beginnt bei einem binären Suchbaum T2 bzgl. der 2.-ten Koordinate, der alle Punkte enthält, die in dem Teilbaum mit Wurzel P enthalten sind. – In diesem Baum enthält wiederum jeder innere Knoten einen Zeiger auf einen (k-2)-dim. range tree; dieser beginnt bei einem binären Suchbaum T3 bzgl. der 3.-ten Koordinate, der alle jetzt noch relevanten Punkte enthält, etc. Petra Mutzel Alg. & Dat. WS 08/09 97 Suche in Range Trees mit k≥2 Dimensionen • Idee – Suche im ersten Baum T1 O(log N) Knoten, die weiter durchsucht werden. Diese enthalten alle Knoten, die im korrekten x-Bereich liegen. – Nun durchsuche den Baum T2 nach dem 2.-ten Bereich; auch hier ergeben sich O(log N) innere Knoten, die weiter untersucht werden müssen; insgesamt sind dies nun O(log2 N), – etc... Petra Mutzel Alg. & Dat. WS 08/09 98 Analyse k-dim. range tree Theorem (ohne Beweis): Sei P eine Punktmenge im kdimensionalen Bereich, k≥2. • Ein range tree für P benutzt O(N logk-1 N) Speicherplatz und kann in Zeit O(N logk-1 N) Zeit aufgebaut werden. • Rechteckige Bereichssuche kann in Zeit O(logk n + F) korrekt durchgeführt werden, wobei F die Anzahl der ausgegebenen Punkte ist. Petra Mutzel Alg. & Dat. WS 08/09 99 Bemerkungen zu Range Trees • Range trees sind asymptotisch schneller als point quad tree und k-d tree. • Sie haben jedoch signifikant höherer Speicherbedarf. • Falls nicht alle Punkte unterschiedliche x-Koordinaten (o.a.) besitzen, dann Trick: baue eine eindeutige Ordnung der Punkte auf indem der Schlüssel durch einen zweiten key ergänzt wird. • Die Suchzeit für 2-dim. Suchbäume kann von O(log2N+F) auf O(log N+F) reduziert werden, z.B durch fractional cascading. • Damit kann auch die Suchzeit für k-dim. range trees um eine Dimension reduziert werden. Petra Mutzel Alg. & Dat. WS 08/09 100 Fractional Cascading [G.S Lueker 1978 and Willard 1978] • Laufzeitanalyse für range tree ergab pro Knoten P im ersten Suchbaum O(log N+FP) • Mit Hilfe von fractional cascading benötigt die erste Suche O(log N+FP), aber die nachfolgenden nur O(1+FP) • Idee: Fractional Cascading hilft bei mehreren 1-dim. Bereichsabfragen über den gleichen Bereich, wenn die Ergebnisse einer Suchanfrage für die nächste verwendet werden kann. Petra Mutzel Alg. & Dat. WS 08/09 101 Einfaches Beispiel • Seien S1 und S2 zwei Mengen von Objekten mit einem ganzzahligen Schlüssel key gespeichert in den Arrays A1 und A2. Wichtig: S2⊆S1. • Annahme: Wir wollen alle Objekte in S1 und S2 ausgeben, deren Schlüssel in dem Intervall [L:R] liegen. • Lösung: Binärsuche über A1 bis ein kleinstes Objekt x gefunden wird, dessen Schlüssel ≥L ist; Wandere von dort nach rechts bis ein Schlüssel >R kommt. • Statt Binärsuche über A2 wäre es jetzt gut, wenn wir von x aus einen Zeiger zu A2 hätten, der auf kleinstes Objekt in A2 zeigt, der ≥key(x) ist. • Es gibt also von jedem Objekt x in S1 einen Zeiger zu dem kleinsten Objekt in S2, der ≥key(x) ist. Petra Mutzel Alg. & Dat. WS 08/09 102 Einfaches Beispiel für Fractional Cascading Bild aus M. de Berg et al. 2000 Petra Mutzel Alg. & Dat. WS 08/09 103 Anwendung auf 2-dim. range tree • Beobachtung: Die Suchbäume bzgl. y der Tiefe t sind in Tiefe t+1 aufgesplittet in den linken und den rechten Teil, also T(LEFT(P))⊆T(P) und T(RIGHT(P))⊆T(P) • Idee: Statt einen Suchbaum zu speichern, wird jeweils nur ein bzgl. y-Koordinate sortiertes ARRAY gespeichert; Ausnahme: die Wurzel hat weiterhin den Suchbaum • Man sucht genau einmal den Beginn Ly des Bereichs in Tass zur Wurzel (Faktor log N); und von dort aus führen Zeiger auf die korrespondierenden Knoten im linken und rechten Unterbaum, u.s.w. • Hierzu benötigen wir für jeden Knoten in der Wurzel UND in jedem ARRAY zu inneren Knoten P zwei Zeiger: einer zum Nachfolger im Feld LEFT(P) und einer zum Nachfolger im Feld RIGHT(P). Petra Mutzel Alg. & Dat. WS 08/09 104 Anwendung auf 2-dim. range tree Lemma: 2-dimensionale Bereichssuche kann mit Hilfe von fractional cascading in Zeit O(log N+F) durchgeführt werden. • Weil man sich von Schicht zu Schicht durchhangelt, heißt dieser range tree auch layered range tree. Petra Mutzel Alg. & Dat. WS 08/09 105 Beispiel für Fractional Cascading Main tree: jeder innere Knoten hat Zeiger auf Array im nächsten Bild Bild aus M. de Berg et al. 2000 Petra Mutzel Alg. & Dat. WS 08/09 106 Beispiel für Fractional Cascading Auf dieses Array verlinkt Wurzel aus Main tree Achtung: nicht alle Links werden angezeigt! Bild aus M. de Berg et al. 2000 Layered Range Tree Theorem: Sei P eine Punktmenge im k-dimensionalen Bereich, k≥2. • Ein layered range tree für P benutzt O(N logk-1 N) Speicherplatz und kann in Zeit O(N logk-1 N) Zeit aufgebaut werden. • Rechteckige Bereichssuche kann in Zeit O(logk-1 n + F) korrekt durchgeführt werden, wobei F die Anzahl der ausgegebenen Punkte ist. Petra Mutzel Alg. & Dat. WS 08/09 108 Aktuelle Entwicklungen • Beste Datenstruktur für 2-dim. range trees benötigt nur O(N log N / log log N) Speicherplatz mit Suchzeit O(log N+k). Dies ist optimal. • Ähnliches gilt für k-dim. range trees: in O(N(log N/loglog N)k-1 Speicherplatz mit polylogarithmischer Suchzeit [beide Resultate von Chazelle 1986, 1990] • Mehr Speicherplatz führt zu besseren Suchzeiten • Inzwischen gibt es auch dynamische range trees • Für große Datenmengen eignen sich spezielle Strukturen für Externspeicher bzw. cache-oblivious • Trianguläre Bereichssuchprobleme können auch mit „partition trees“ erfolgreich gelöst werden. Petra Mutzel Alg. & Dat. ENDE WS Bereichsabfragen 08/09 109