Quadtree (myös quadtree , 4-tree , englanniksi quadtree ) on puu , jossa jokaisella sisäisellä solmulla on täsmälleen 4 jälkeläistä. Nelipuita käytetään usein jakamaan rekursiivisesti 2D-avaruus 4 kvadranttiin (alueeseen). Alueet ovat neliöitä, suorakulmioita tai niillä on mielivaltainen muoto. Englanninkielisen termin quadtree loivat Raphael Finkel ja John Bentley .vuonna 1974. Samanlainen avaruusosio tunnetaan Q-puuna. Eri tyyppisten nelipuiden yhteisiä piirteitä:
Nelospuut voidaan luokitella niiden edustaman datatyypin mukaan - avaruus, pisteet, viivat, käyrät. Ne voidaan myös jakaa sillä, riippuuko puun muoto tietojen käsittelyjärjestyksestä. Joitakin nelipuita:
Alueneljäspuu edustaa mitä tahansa kaksiulotteisen avaruuden osaa jakamalla se 4 kvadranttiin, alaneljännekseen ja niin edelleen, jolloin jokainen puun lehti vastaa tiettyä aluetta . Jokaisella puun solmulla on joko 4 lasta tai ei ollenkaan (lehtiä). Avaruutta jakavat nelipuut eivät ole täysin puita, koska osakvadranttien sijainti on tiedosta riippumaton. Oikeampi nimi on etuliitepuut ( eng. trie ).
Puuta, jonka korkeus on n , voidaan käyttää kuvaamaan 2n × 2n pikselistä koostuvaa kuvaa , jossa jokaisen pikselin arvo on 0 tai 1. Puun juuri edustaa koko kuvan aluetta. Jos kaikki pikselit eivät ole vain nollia tai vain ykkösiä, se rikkoutuu. Tässä tapauksessa jokainen arkki vastaa pikselien joukkoa - joko vain nollia tai vain ykkösiä.
Tilaa rikkovia nelipuita voidaan käyttää myös esittämään tietojoukon muuttuvaa resoluutiota. Esimerkiksi lämpötilatiedot voidaan tallentaa nelipuuna, jonka jokainen solmu tallentaa lapsisolmujensa keskilämpötilan.
Jos puuta käytetään edustamaan pistejoukkoa (esimerkiksi joidenkin kaupunkien sijaintien leveys- ja pituusaste), alueet jaetaan alaryhmiin, kunnes lehdet sisältävät enintään yhden pisteen.
Pisteneliöpuu on eräänlainen binääripuu, jota käytetään tallentamaan tietoja tason pisteistä . Puun muoto riippuu siitä, missä järjestyksessä tiedot on määritetty. Tällaisten puiden käyttö on erittäin tehokasta tason järjestellisten pisteiden vertailussa ja käsittelyaika on O(log n) .
SolmurakenneNelipuun solmu, joka tallentaa tietoja tason pisteistä, on samanlainen kuin binääripuun solmu, ja ainoa varoitus, että ensimmäisellä solmulla on neljä lasta (yksi jokaiselle neljännekselle) kahden sijaan ("oikea" ja " vasemmalle”). Solmuavaimessa on kaksi komponenttia ( x- ja y -koordinaateille ). Siten puusolmu sisältää seuraavat tiedot:
Nelipuita, jotka tallentavat tietoja viivoista ( reunaneliöpuu ), käytetään kuvaamaan suoria viivoja ja käyriä . Käyrät kuvataan tarkoilla approksimaatioilla jakamalla solut hyvin pieniksi. Tämä voi aiheuttaa puun epätasapainon, mikä tarkoittaa indeksointiongelmia.
Nelosipuut, jotka tallentavat tietoa polygoneista ( eng. polygonal map quadtree/PMQuadtree ), voivat sisältää tietoa monikulmioista, mukaan lukien rappeutuneet (joilla on eristetyt kärjet tai pinnat) [1] .
Quadtrees on kaksiulotteinen analogi oktanttipuille ( eng. octree ).
Seuraava koodi osoittaa nelipuiden käytön pistetietojen tallentamiseen. Myös muut lähestymistavat rakentamiseen ovat mahdollisia.
Seuraavia tietorakenteita odotetaan käytettävän.
// Yksinkertainen rakenne edustamaan piste- tai vektorirakennetta XY { kellua x; kellua y; funktio __construct( float _x, float _y) {...} } // Axis-aligned bounding box (AABB), puolimittainen keskitetty rakenne AABB { XY- keskus; XY puolimitta; funktio __construct( XY center, XY halfDimension) {...} funktio sisältääPiste( XY p) {...} funktio leikkaaAABB ( AABB muu) {...} }Luokka edustaa itse 4-puuta ja juurisolmua.
luokan QuadTree { // Vakio - yhteen solmuun tallennettavien elementtien määrä vakio int QT_NODE_CAPACITY = 4; // Akselilinjattu rajauslaatikko // näyttää puun AABB rajan rajat; // Pisteet XY [koko = QT_NODE_CAPACITY] pisteen ryhmä; // QuadTreen* luoteisjälkeläiset; QuadTree* koilliseen; QuadTree* lounaaseen; QuadTree* kaakkois; // Metodit function __construct( AABB _boundary) {...} function insert( XY p) {...} function subdivide() {...} // Luo 4 alaosaa, jotka jakavat kvadrantin 4 yhtä suureen osaan function queryRange( AABB- alue) {...} }Seuraava menetelmä lisää pisteen sopivaan puun neljännekseen ja halkaisee tarvittaessa.
Seuraava menetelmä löytää kaikki pisteet tietyltä alueelta.
luokan QuadTree { ... // Etsi pisteitä alueen sisällä funktio queryRange( AABB range) { // Valmistele taulukko tulokselle Array of XY pointsInRange; // Peruuta, jos alue ei vastaa kvadranttia if (!boundary.insersectsAABB(alue)) return pointsInRange; // Tyhjä lista // Tarkista nykyisen tason kohteet ( int p := 0; p < points.size; p++) { if (alue.containsPoint(points[p])) pointsInRange.append(points[p]); } // Pysäytä, jos lapsia ei ole enää if (northWest == null ) return pointsInRange; // Lisää kaikki alipisteet pointsInRange.appendArray(northWest->queryRange(range)); pointsInRange.appendArray(northEast->queryRange(range)); pointsInRange.appendArray(southWest->queryRange(alue)); pointsInRange.appendArray(southEast->queryRange(alue)); return pointsInRange; } }Quadtrees] (heinäkuu 1985). Käyttöpäivä: 23. maaliskuuta 2012. Arkistoitu alkuperäisestä 2. lokakuuta 2012.
Puu (tietorakenne) | |
---|---|
Binääripuut | |
Itsetasapainottavat binaaripuut |
|
B-puut | |
etuliite puita |
|
Avaruuden binaarinen osiointi | |
Ei-binääripuut |
|
Avaruuden hajottaminen |
|
Muut puut |
|
Algoritmit |