Quadtree

Quadtree (även quadtree , 4-tree , engelska  quadtree ) är ett träd där varje intern nod har exakt 4 avkomlingar. Quadtrees används ofta för att rekursivt dela upp ett 2D-utrymme i 4 kvadranter (regioner). Ytor är kvadrater, rektanglar eller har en godtycklig form. Den engelska termen quadtree myntades av Raphael Finkel och John Bentley .år 1974. En liknande uppdelning av rymden är känd som ett Q-träd. Vanliga egenskaper hos olika typer av quadtrees:

Klassificering

Quadtrees kan klassificeras efter vilken typ av data de representerar - rymd, punkter, linjer, kurvor. De kan också delas upp efter om formen på trädet beror på i vilken ordning uppgifterna behandlas. Några typer av quadtrees:

Region quadtree

Region quadtree representerar vilken del som helst av ett tvådimensionellt utrymme genom att dela upp det i 4 kvadranter, underkvadranter och så vidare, där varje löv i trädet motsvarar ett visst område .  Varje nod i trädet har antingen 4 barn, eller inga alls (löv). Space-partitionerande quadtrees är inte helt träd eftersom positionen för subkvadranterna är oberoende av data. Ett mer korrekt namn är prefix trees ( eng. try ).  

Ett träd med höjden n kan användas för att representera en bild som består av 2n × 2n pixlar, där varje pixel har ett värde på 0 eller 1. Trädets rot representerar hela bildens yta. Om inte alla pixlar bara är nollor eller bara ettor går det sönder. I det här fallet motsvarar varje ark en uppsättning pixlar - antingen bara nollor eller bara ettor.

Space breaking quadtrees kan också användas för att representera den variabla upplösningen för en datamängd. Till exempel kan temperaturinformation lagras som ett quadtree, vars varje nod lagrar medeltemperaturen för sina undernoder.

Om trädet används för att representera en uppsättning punkter (till exempel latitud och longitud för positionerna för vissa städer), delas regionerna upp tills löven inte innehåller mer än en punkt.

punkt quadtree

Point quadtree är en typ av binärt träd som används för att lagra information om punkter på ett plan .  Trädets form beror på i vilken ordning data specificeras. Användningen av sådana träd är mycket effektiv för att jämföra ordnade punkter i planet, och bearbetningstiden är O(log n) .

Nodstruktur

Noden på quadtree som lagrar information om planets punkter liknar noden i ett binärt träd, med den enda varningen att den första noden har fyra barn (en för varje kvadrant) istället för två ("höger" och " vänster"). Nodnyckeln har två komponenter (för x- och y -koordinater ). Således innehåller en trädnod följande information:

  • 4 pekare: quad['NW'] , quad['NE'] , quad['SW'] , och quad['SE'] ,
  • punkt beskrivs enligt följande:
    • tangent , uttrycker vanligtvis x- och y -koordinater ,
    • värdet värde , till exempel ett namn.

Edge quadtree

Quadtrees som lagrar information om linjer ( edge quadtree ) används för att beskriva raka linjer och kurvor .  Kurvorna beskrivs med exakta approximationer genom att dela upp cellerna i mycket små. Detta kan göra att trädet blir obalanserat, vilket innebär indexeringsproblem.

Polygonal karta quadtree

Quadtrees som lagrar information om polygoner ( eng.  polygonal map quadtree/PMQuadtree ) kan innehålla information om polygoner, inklusive degenererade sådana (som har isolerade hörn eller ytor) [1] .

Användningsfall

Quadtrees är en tvådimensionell analog av oktantträd ( eng.  octree ).

Pseudokod

Följande kod visar användningen av quadtrees för att lagra punktinformation. Andra sätt att bygga är också möjliga.

Datastrukturer

Följande datastrukturer förväntas användas.

// En enkel struktur för att representera en punkt eller vektorstruktur XY { flyta x; flyta y; funktion __construct( flyta _x, flyta _y) {...} } // Axis-aligned bounding box (AABB), halvdimension centrerad struktur AABB { XY centrum; XY halvdimension; function __construct( XY center, XY halfDimension) {...} functions containsPoint( XY p) {...} functions cutsAABB( AABB other) {...} }

QuadTree-klassen

Klassen representerar själva 4-trädet och rotnoden.

klass QuadTree { // Konstant - antalet element som kan lagras i en nodkonstant int QT_NODE_CAPACITY = 4; // En axelinriktad begränsningsruta // visar gränserna för trädets AABB- gräns; // Points Array av XY [size = QT_NODE_CAPACITY] punkter; // Ättlingar av QuadTree* nordväst; QuadTree* nordost; QuadTree* sydväst; QuadTree* sydost; // Methods function __construct( AABB _boundary) {...} function insert( XY p) {...} function subdivide() {...} // Skapa 4 barn som delar upp kvadranten i 4 lika delar funktion queryRange( AABB- intervall) {...} }

Infoga

Följande metod infogar en punkt i den lämpliga kvadranten av trädet, delar upp om det behövs.


klass QuadTree { ... // Infoga punkt funktion infoga( XY p) { // Ignorera objekt som inte finns i trädet om (!boundary.containsPoint(p)) returnerar false ; // Objekt kan inte läggas till // Infoga om det finns plats if (points.size < QT_NODE_CAPACITY) { poäng append(p); returnera sant ; } // Därefter måste du dela området och lägga till en punkt till valfri nod om (nordväst == null ) subdivide(); if (nordväst->insert(p)) returnerar true ; if (nordöst->insert(p)) returnerar sant ; if (sydväst->insert(p)) returnerar true ; if (sydöst->insert(p)) returnerar sant ; // Av någon anledning kan infogningen misslyckas (vilket den egentligen inte borde) returnera false ; } }

Gå in i intervallet

Följande metod hittar alla punkter inom ett visst intervall.

klass QuadTree { ... // Hitta punkter inom intervallet funktion queryRange( AABB range) { // Förbered en array för resultatet Array av XY pointsInRange; // Avbryt om intervallet inte matchar kvadranten om (!boundary.insersectsAABB(range)) returnerar pointsInRange; // Tom lista // Kontrollera aktuella nivåobjekt för ( int p := 0; p < points.size; p++) { if (range.containsPoint(points[p])) pointsInRange.append(points[p]); } // Stoppa om det inte finns fler barn om (nordväst == null ) returnerar pointsInRange; // Lägg till alla underordnade poäng pointsInRange.appendArray(northWest->queryRange(range)); pointsInRange.appendArray(northEast->queryRange(range)); pointsInRange.appendArray(southWest->queryRange(range)); pointsInRange.appendArray(southEast->queryRange(range)); return pointsInRange; } }

Se även

Länkar

Anteckningar

  1. Hanan Samet och Robert Webber. "Lagra en samling polygoner med hjälp av Quadtrees". ACM Transactions on Graphics juli 1985: 182-222. infolab . Webb. 23 mars 2012
  2. Tomas G. Rokicki. En algoritm för att komprimera rum och tid (1 april 2006). Hämtad 20 maj 2009. Arkiverad från originalet 2 oktober 2012.
  3. Henning Eberhardt, Vesa Klumpp, Uwe D. Hanebeck, Density Trees for Efficient Nolinear State Estimation , Proceedings of the 13th International Conference on Information Fusion, Edinburgh, Storbritannien, juli 2010.

Källor

  1. Raphael Finkel och JL Bentley. Quad Trees: A Data Structure for Retrieval on Composite Keys  //  Acta Informatica : journal. - 1974. - Vol. 4 , nr. 1 . - S. 1-9 . - doi : 10.1007/BF00288933 .
  2. Mark de Berg, Marc van Kreveld, Mark Overmars och Otfried Schwarzkopf. Beräkningsgeometri  (obestämd) . — 2:a revisionen. - Springer-Verlag , 2000. - ISBN 3-540-65620-0 . Kapitel 14: Quadtrees: pp. 291–306.
  3. Samet, Hanan; Webber, Robert [ http://infolab.usc.edu/csci585/Spring2008/den_ar/p182-samet.pdf Lagra en samling polygoner med

Quadtrees] (juli 1985). Tillträdesdatum: 23 mars 2012. Arkiverad från originalet 2 oktober 2012.

Externa länkar