Quadtree

Quadtree (și quadtree , 4-tree , engleză  quadtree ) este un arbore în care fiecare nod intern are exact 4 descendenți. Quadtrees sunt adesea folosiți pentru a partiționați recursiv un spațiu 2D în 4 cadrane (regiuni). Zonele sunt pătrate, dreptunghiuri sau au o formă arbitrară. Termenul englezesc quadtree a fost inventat de Raphael Finkel și John Bentley .în 1974. O partiție similară a spațiului este cunoscută sub numele de Q-tree. Caracteristici comune ale diferitelor tipuri de quadtrees:

Clasificare

Quadtrees pot fi clasificate în funcție de tipul de date pe care le reprezintă - spațiu, puncte, linii, curbe. Ele pot fi, de asemenea, împărțite dacă forma arborelui depinde de ordinea în care sunt prelucrate datele. Câteva tipuri de quadtrees:

Regiune quadtree

Regiunea quadtree reprezintă orice parte a unui spațiu bidimensional, împărțind-o în 4 cadrane, sub-cadrante și așa mai departe, fiecare frunză a arborelui corespunzând unei anumite zone .  Fiecare nod al arborelui are fie 4 copii, fie nici unul (frunze). Arborii pătrați cu partiții spațiale nu sunt arbori complet deoarece poziția subcadranelor este independentă de date. Un nume mai corect este arbori de prefix ( eng. trie ).  

Un arbore de înălțime n poate fi utilizat pentru a reprezenta o imagine formată din 2n × 2n pixeli, unde fiecare pixel are o valoare de 0 sau 1. Rădăcina arborelui reprezintă întreaga zonă a imaginii. Dacă nu toți pixelii sunt doar zerouri sau numai uni, se rupe. În acest caz, fiecare coală corespunde unui set de pixeli - fie numai zerouri, fie numai uni.

Arborele patru care sparge spațiul pot fi, de asemenea, utilizați pentru a reprezenta rezoluția variabilă a unui set de date. De exemplu, informațiile despre temperatură pot fi stocate ca un quadtree, fiecare nod memorând temperatura medie a nodurilor sale secundare.

Dacă arborele este folosit pentru a reprezenta un set de puncte (de exemplu, latitudinea și longitudinea pozițiilor unor orașe), regiunile sunt subdivizate până când frunzele nu conțin mai mult de un punct.

point quadtree

Point quadtree este un tip de arbore binar folosit pentru a stoca informații despre punctele dintr-un plan .  Forma arborelui depinde de ordinea în care sunt specificate datele. Utilizarea unor astfel de arbori este foarte eficientă în compararea punctelor ordonate din plan, iar timpul de procesare este O(log n) .

Structura nodului

Nodul arborelui quadtree care stochează informații despre punctele planului este similar cu nodul unui arbore binar, cu singura avertizare că primul nod are patru copii (câte unul pentru fiecare cadran) în loc de doi ("dreapta" și " stânga"). Cheia de nod are două componente (pentru coordonatele x și y ). Astfel, un nod de arbore conține următoarele informații:

  • 4 indicatori: quad['NW'] , quad['NE'] , quad['SW'] , and quad['SE'] ,
  • punct descris după cum urmează:
    • cheie , de obicei exprimă coordonatele x și y ,
    • valoarea valorii , de exemplu, un nume.

Edge quadtree

Quadtrees care stochează informații despre linii ( edge ​​quadtree ) sunt utilizați pentru a descrie linii drepte și curbe .  Curbele sunt descrise prin aproximări exacte prin împărțirea celulelor în unele foarte mici. Acest lucru poate duce la dezechilibrarea arborelui, ceea ce înseamnă probleme de indexare.

Hartă poligonală quadtree

Quadtrees care stochează informații despre poligoane ( eng.  polygonal map quadtree/PMQuadtree ) pot conține informații despre poligoane, inclusiv cele degenerate (având vârfuri sau fețe izolate) [1] .

Cazuri de utilizare

Quadtrees sunt un analog bidimensional al copacilor octanți ( eng.  octree ).

Pseudocod

Următorul cod demonstrează utilizarea quadtrees pentru a stoca informații despre puncte. Sunt posibile și alte abordări ale construcției.

Structuri de date

Următoarele structuri de date sunt de așteptat să fie utilizate.

// O structură simplă pentru a reprezenta un punct sau o structură vectorială XY { float x; float y; funcția __construct( float _x, float _y) {...} } // Casetă de delimitare aliniată pe axă (AABB), structură centrată pe jumătate de dimensiune AABB { centru XY ; semidimensiune XY ; function __construct( XY center, XY halfDimension) {...} function containsPoint( XY p) {...} function intersectsAABB( AABB other) {...} }

Clasa QuadTree

Clasa reprezintă arborele 4 în sine și nodul rădăcină.

clasa QuadTree { // Constant - numărul de elemente care pot fi stocate într-un singur nod constant int QT_NODE_CAPACITY = 4; // O casetă de delimitare aliniată la axă // arată limitele limitei arborelui AABB ; // Points Array of XY [size = QT_NODE_CAPACITY] points; // Descendenții lui QuadTree* nord- vest; QuadTree* nord-est; QuadTree * sud- vest; QuadTree * sud- est; // Metode funcția __construct( AABB _boundary) {...} function insert( XY p) {...} function subdivide() {...} // Creați 4 copii care împart cadranul în 4 părți egale function queryRange( gama AABB ) {...} }

Inserați

Următoarea metodă inserează un punct în cadranul corespunzător al arborelui, împărțind dacă este necesar.


clasa QuadTree { ... // Inserează funcția punct de inserare ( XY p) { // Ignoră obiectele care nu sunt în arbore dacă (!boundary.containsPoint(p)) returnează false ; // Obiectul nu poate fi adăugat // Inserați dacă există spațiu dacă (points.size < QT_NODE_CAPACITY) { puncte anexează(p); returnează adevărat ; } // În continuare, trebuie să împărțiți zona și să adăugați un punct la orice nod dacă (northWest == null ) subdivide(); if (northWest->insert(p)) return true ; if (northEast->insert(p)) return true ; if (southWest->insert(p)) return true ; if (sud-est->insert(p)) returnează adevărat ; // Din anumite motive, inserarea ar putea eșua (ceea ce chiar nu ar trebui) să returneze false ; } }

Intrarea în interval

Următoarea metodă găsește toate punctele dintr-un anumit interval.

clasa QuadTree { ... // Găsiți puncte în intervalul funcției queryRange ( interval AABB ) { // Pregătește o matrice pentru rezultatul Array de XY pointsInRange; // Anulează dacă intervalul nu se potrivește cu cadranul dacă (!boundary.insersectsAABB(range)) returnează pointsInRange; // Listă goală // Verificați obiectele de nivel curent pentru ( int p := 0; p < points.size; p++) { dacă (range.containsPoint(puncte[p])) pointsInRange.append(puncte[p]); } // Opreste daca nu mai sunt copii daca (northWest == null ) returneaza puncteInRange; // Adăugați toate punctele copil pointsInRange.appendArray(northWest->queryRange(interval)); pointsInRange.appendArray(northEast->queryRange(interval)); pointsInRange.appendArray(southWest->queryRange(gamă)); pointsInRange.appendArray(southEast->queryRange(gamă)); return pointInRange; } }

Vezi și

Link -uri

Note

  1. Hanan Samet și Robert Webber. „Stocarea unei colecții de poligoane folosind Quadtrees”. ACM Transactions on Graphics iulie 1985: 182-222. infolab . Web. 23 martie 2012
  2. Tomas G. Rokicki. Un algoritm pentru comprimarea spațiului și timpului (1 aprilie 2006). Consultat la 20 mai 2009. Arhivat din original la 2 octombrie 2012.
  3. Henning Eberhardt, Vesa Klumpp, Uwe D. Hanebeck, Density Trees for Efficient Nonlinear State Estimation , Proceedings of the 13th International Conference on Information Fusion, Edinburgh, Regatul Unit, iulie 2010.

Surse

  1. Raphael Finkel și JL Bentley. Quad Trees: A Data Structure for Retrieval on Composite Keys  //  Acta Informatica : jurnal. - 1974. - Vol. 4 , nr. 1 . - P. 1-9 . - doi : 10.1007/BF00288933 .
  2. Mark de Berg, Marc van Kreveld, Mark Overmars și Otfried Schwarzkopf. Geometrie computațională  (nedefinită) . - a 2-a revizuire. - Springer-Verlag , 2000. - ISBN 3-540-65620-0 . Capitolul 14: Quadtrees: pp. 291–306.
  3. Samet, Hanan; Webber, Robert [ http://infolab.usc.edu/csci585/Spring2008/den_ar/p182-samet.pdf Stocarea unei colecții de poligoane folosind

Quadtrees] (iulie 1985). Data accesului: 23 martie 2012. Arhivat din original pe 2 octombrie 2012.

Link- uri externe