karteesinen puu | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Englanti Treap | ||||||||||||||||
Tyyppi | Binäärihakupuu | |||||||||||||||
Keksintövuosi | 1989 | |||||||||||||||
Tekijä | Raimund Siedel, Cecilia Aragon | |||||||||||||||
Monimutkaisuus O - symboleissa | ||||||||||||||||
|
||||||||||||||||
Mediatiedostot Wikimedia Commonsissa |
Karteesinen puu on binääripuu , jonka solmut tallentavat:
Viittaus pääsolmuun on valinnainen, se on toivottavaa vain lineaarisen puunrakennusalgoritmille.
Karteesinen puu ei ole itsetasapainottava tavallisessa merkityksessä, ja sitä käytetään seuraavista syistä:
Karteesisen puun haitat:
Englanninkielisessä kirjallisuudessa karteesista puuta, joka on rakennettu joukolle annettuja avaimia ja niitä muodostettaessa niille osoitettuja satunnaisia painoja, kutsutaan lompakkosanaksi treap , koska se yhdistää lajittelukasapuun ( kasa ) ja satunnaisen binääripuun ( puu ) ominaisuudet. ) logaritmisella korkeusodotuksella . Venäjän kielessä sanat ducha [1] ( puu + kasa ), deramide ( puu + pyramidi ), kurevo ( kasa + puu ) ehdotettiin samanlaisiksi kuin sana treap .
Yksinkertaisin ymmärrettävä algoritmi karteesisen puun muodostamiseksi dataparien (x, y) joukosta on seuraava. Järjestetään kaikki parit avaimella x ja numeroidaan tuloksena oleva näppäinsarja y:
y(1), y(2), y(3), …, y(n).
Etsitään pienin avain y. Olkoon se y(k). Siitä tulee puun juuri. Avain y(k) jakaa näppäinsarjan y kahteen osaan:
y(1), …, y(k-1); y(k+1), …, y(n).
Jokaisesta niistä löydämme minimin y - nämä ovat solmun y (k) lapset - vasemmalla ja oikealla. Saatujen 4 kappaleen (mahdollisesti vähemmän) kanssa teemme saman. Ehdotettu algoritmi karteesisen puun rakentamiseksi perustuu rekursioon: etsimme jonosta minimin y ja annamme sen juureksi. found y jakaa sekvenssin kahteen osaan, jokaiselle osalle suoritetaan algoritmi karteesisen puun rakentamiseksi.
Kaavamaisesti tämä voidaan kirjoittaa seuraavasti:
T( y(1), ..., y(n) ) = juuri: y(k) vasen_puu: T( y(1), ..., y(k−1) ) oikea_puu: T( y(k+1), ..., y(n)) ) missä y(k) = min( y(1), ..., y(n) )
Tästä algoritmista seuraa, että parien joukko (x, y) määrittää yksiselitteisesti karteesisen puun rakenteen. Vertailun vuoksi huomaa, että binäärihakupuuhun tallennetut avaimet eivät määritä yksiselitteisesti puun rakennetta. Sama pätee binäärikekoon - binäärikeon rakenne (miten avaimet jakautuvat solmujen kesken) ei riipu vain itse avainjoukosta, vaan myös sekvenssistä, jossa ne lisätään. Karteesisessa puussa ei ole tällaista epäselvyyttä.
Toinen puunrakennusalgoritmi perustuu myös rekursioon. Vasta nyt lisäämme elementit y peräkkäin ja rakennamme puun uudelleen. Puu T(y(1), …, y(k+1)) rakennetaan puusta T(y(1), …, y(k)) ja seuraavasta elementistä y(k+1).
T( y(1), ..., y(k+1) ) = F ( T( y(1), ..., y(k) ), y(k+1) )Jokaisessa vaiheessa muistamme linkin viimeksi lisättyyn solmuun. Hän tulee olemaan oikealla. Olemme todellakin tilaaneet avaimet y niihin liitetyn avaimen x mukaan. Koska karteesinen puu on hakupuu, vaakaviivalle projisoinnin jälkeen x-näppäinten on kasvattava vasemmalta oikealle. Oikeanpuoleisella solmulla on aina suurin mahdollinen avainarvo x.
Funktio F, joka kuvaa edellisen vaiheen karteesisen puun T(y(1), …, y(k)) ja seuraavan y(k+1) uudeksi puuksi T(y(1), …, y(k) +1)) seuraavasti. Solmun y(k+1) pystysuora on määritelty. Meidän on päätettävä sen horisontaalisuudesta. Ensin tarkistetaan, voidaanko uudesta solmusta y(k+1) tehdä solmun y(k) oikea lapsi - tämä tulee tehdä, jos y(k+1) > y(k). Muussa tapauksessa nostetaan rinnettä solmusta y(k) ja katsotaan sinne tallennettua y:n arvoa. Kiipeä rinnettä ylös, kunnes löydämme solmun, jossa y:n arvo on pienempi kuin y(k+1), minkä jälkeen teemme y(k+1):stä sen oikea lapsi ja sen edellisestä oikeasta lapsesta y(:n vasen lapsi k+ yksi).
Tämä algoritmin kuoletus (kaikkien vaiheiden summana) toimii lineaarisessa ajassa (lisättyjen solmujen lukumäärän mukaan). Todellakin, heti kun "asimme" minkä tahansa solmun yli kiipeämällä rinnettä ylöspäin, emme koskaan tapaa sitä, kun lisäämme seuraavia solmuja. Siten rinteessä olevien askelmien kokonaismäärä ei voi olla suurempi kuin solmujen kokonaismäärä.
Puu (tietorakenne) | |
---|---|
Binääripuut | |
Itsetasapainottavat binaaripuut |
|
B-puut | |
etuliite puita |
|
Avaruuden binaarinen osiointi | |
Ei-binääripuut |
|
Avaruuden hajottaminen |
|
Muut puut |
|
Algoritmit |