R-puu | |||||||
---|---|---|---|---|---|---|---|
Tyyppi | Moniulotteinen puu Binäärihakupuu | ||||||
Keksintövuosi | 1984 | ||||||
Tekijä | Antonin Guttman | ||||||
Monimutkaisuus O - symboleissa | |||||||
|
|||||||
Mediatiedostot Wikimedia Commonsissa |
R-tree ( eng. R-trees ) on puumainen tietorakenne ( puu ), jonka Antonin Guttman ehdotti vuonna 1984 . Se on samanlainen kuin B-puu , mutta sitä käytetään spatiaalisen tiedon saamiseksi eli moniulotteisten tietojen , kuten maantieteellisten tietojen indeksointiin , joissa on kaksiulotteiset koordinaatit ( leveysaste ja pituusaste ). Tyypillinen R-puita käyttävä kysely voisi olla: "Etsi kaikki museot 2 kilometrin säteellä nykyisestä sijainnistani."
Tämä tietorakenne jakaa moniulotteisen avaruuden joukoksi hierarkkisesti sisäkkäisiä ja mahdollisesti leikkaavia suorakulmioita (kaksiulotteista tilaa varten). Kolmiulotteisen tai moniulotteisen avaruuden tapauksessa ne ovat suorakaiteen muotoisia suuntaissärmiöitä ( cuboids ) tai rinnakkaisia .
Lisäys- ja poistoalgoritmit käyttävät näitä rajoitusruutuja varmistaakseen, että "suljetut" objektit sijoitetaan samaan lehtien kärkeen. Erityisesti uusi objekti osuu lehtipisteeseen, joka tarvitsee rajauslaatikonsa pienimmän laajennuksen. Jokainen lehtisolmuelementti tallentaa kaksi tietokenttää: tavan tunnistaa objektia kuvaavat tiedot (tai itse dataa) ja tämän objektin rajoituslaatikon.
Vastaavasti hakualgoritmit (esim. risteys, sisällyttäminen, naapuruus) käyttävät rajausruutuja päättääkseen, etsitäänkö lapsisolmussa. Näin ollen useimpia pisteitä ei koskaan kosketeta haun aikana. Kuten B-puiden kohdalla, tämä R-puiden ominaisuus tekee niistä sopivia tietokantoihin , joissa kärjet voidaan vaihtaa levylle tarpeen mukaan.
Ylivuoteltujen pisteiden jakamiseen voidaan käyttää erilaisia algoritmeja, mikä johtaa R-puiden jakamiseen alatyyppeihin: neliö ja lineaarinen.
Aluksi R-puut eivät takaaneet hyvää huonoimman tapauksen suorituskykyä , vaikka ne toimivat hyvin todellisilla tiedoilla. Vuonna 2004 kuitenkin julkaistiin uusi algoritmi , joka määrittää prioriteettipuut . Väitetään, että tämä algoritmi on yhtä tehokas kuin tehokkaimmat nykyaikaiset menetelmät ja samalla optimaalinen pahimpaan tapaukseen [1] .
Jokaisessa R-puun kärjessä on vaihteleva määrä elementtejä (ei enempää kuin jokin ennalta määrätty maksimi). Kukin ei-lehtipisteen elementti tallentaa kaksi tietokenttää: tavan tunnistaa lapsipiste ja rajauslaatikon (kuutiomuoto), joka sulkee sisäänsä kyseisen lapsipisteen kaikki elementit. Kaikki tallennetut tuplet säilytetään samalla syvyystasolla, joten puu on täydellisesti tasapainossa. Kun suunnittelet R-puuta, sinun on asetettava joitain vakioita:
Jotta algoritmit toimisivat oikein, ehdon MinEntries <= MaxEntries / 2 on täytyttävä. Juurisolmulla voi olla 2 - MaxEntries jälkeläisiä. Usein valitaan MinEntries = 2, jolloin juurelle täyttyvät samat ehdot kuin muille vertekseille. Joskus on myös viisasta varata erilliset vakiot lehtipisteiden pisteiden lukumäärälle, koska niitä voi usein tehdä enemmän.
R-puun rakentaminen tapahtuu pääsääntöisesti kutsumalla toistuvasti elementin puuhun lisäämistä. Lisäämisen idea on samanlainen kuin B-puuhun lisääminen: jos elementin lisääminen seuraavaan kärkeen johtaa ylivuotoon, kärki jaetaan. Alla on Antonin Guttmanin kuvaama klassinen lisäysalgoritmi .
Lisää funktioErilaisia algoritmeja voidaan käyttää kärkien erottamiseen, tämä on yksi niistä. Sillä on vain lineaarinen monimutkaisuus ja se on helppo toteuttaa, vaikka se ei tuotakaan optimaalisin erottelua. Käytäntö kuitenkin osoittaa, että tällainen monimutkaisuus yleensä riittää.
Joskus R-puun sijasta käytetään ns. cR-puuta (c tarkoittaa klusteroitua ). Perusajatuksena on, että klusterointialgoritmeja , kuten k-means , käytetään erottamaan pisteitä tai pisteitä . K-keskiarvojen monimutkaisuus on myös lineaarinen, mutta useimmissa tapauksissa se antaa paremman tuloksen kuin lineaarinen Guttman-erottelualgoritmi, toisin kuin se ei vain minimoi laatikoiden verhojen kokonaispinta-alaa, vaan myös etäisyyttä. niiden ja päällekkäisalueen välillä. Pisteklusteroinnissa käytetään alkuperäisen avaruuden valittua metriikkaa, kärkiklusteroinnissa voidaan käyttää niiden suuntaissärmiöiden verhojen keskipisteiden välistä etäisyyttä tai niiden välistä maksimietäisyyttä.
Klusterointialgoritmit eivät ota huomioon sitä, että algoritmin vakiot rajoittavat kärjen jälkeläisten määrää ylhäältä ja alhaalta. Jos klusterin jakaminen tuottaa kelpaamattoman tuloksen, voit käyttää klassista algoritmia tälle joukolle, koska näin ei tapahdu usein käytännössä.
Mielenkiintoinen idea on käyttää klusterointia useisiin klustereihin, joissa useita voi olla enemmän kuin kaksi. On kuitenkin otettava huomioon, että tämä asettaa tiettyjä rajoituksia p-puurakenteen parametreille.
Huomaa, että cR-puun lisäksi on sen klusterointimenetelmään perustuva muunnelma clR-puu, jossa keskipisteenä käytetään iteratiivista algoritmia "sijoitteluongelman" ratkaisemiseksi. Algoritmilla on neliöllinen laskennallinen monimutkaisuus, mutta se tarjoaa kompaktimpien suuntaissärmiöiden verhokäyrien rakentamisen rakenteen kärkipisteiden tietueissa.
Puussa etsiminen on melko triviaalia, sinun on vain otettava huomioon se tosiasia, että jokainen avaruuden piste voidaan peittää useilla pisteillä.
Tämä algoritmi [2] poistaa jonkin merkinnän E R-puusta. Algoritmi koostuu seuraavista vaiheista:
FindLeaf-toiminto
Olkoon T puun juuri ja olkoon E haluttu merkintä.
CondenseTree-toiminto
Poistetaan tietue E taulukosta L. Sitten on tarpeen poistaa solmu, jolla on vähän tietueita jäljellä (vähemmän kuin MinEntries) ja siirtää sen tietueet. Kun siirryt ylös puussa, poista merkinnät tarvittaessa (samoilla kriteereillä). Matkalla juureen laske suorakulmiot uudelleen tekemällä niistä mahdollisimman pieniä. Algoritmi on kuvattu alla. Tämä toiminto voidaan toteuttaa myös rekursiolla.
Puu (tietorakenne) | |
---|---|
Binääripuut | |
Itsetasapainottavat binaaripuut |
|
B-puut | |
etuliite puita |
|
Avaruuden binaarinen osiointi | |
Ei-binääripuut |
|
Avaruuden hajottaminen |
|
Muut puut |
|
Algoritmit |