Algoritmit 2 Luento 6 To 28.3.2019 Timo Männikkö
Luento 6 B-puun operaatiot Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 2/30
B-puu 40 60 80 130 90 100 200 250 340 400 150 180 Astetta m oleva B-puu: 210 220 240 270 300 Alkioita m 1... 2m 1 Osoittimia m... 2m 360 370 420 440 460 Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 3/30
B-puun operaatiot: Haku Alkion haku: Aloitetaan juurisolmusta Etsitään alkiota solmusta Jos alkio ei ole solmussa, siirrytään alkion avainta vastaavaan alipuuhun Jatketaan samalla tavalla Tarvittaessa johonkin lehtisolmuun saakka Lopetetaan kun alkio löytyy, tai kun todetaan että alkiota ei ole puussa Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 4/30
B-puun operaatiot: Lisäys Alkion lisäys: Kuljetaan juurisolmusta kohti avainta vastaavaa lehtisolmua Jos hakupolulla täysi solmu, halkaistaan se kahdeksi solmuksi ennen kuin jatketaan Jos juurisolmu täysi, muodostetaan uusi taso juurisolmun alapuolelle Lisätään alkio lehtisolmuun Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 5/30
B-puun operaatiot: Lisäys Hakupolulla on päästy solmuun x Hakupolku jatkuisi solmusta y, mutta y on täysi Solmun halkaisu: y x a x y a z Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 6/30
B-puun operaatiot: Lisäys Juurisolmua ei voi halkaista samalla tavalla Sen sijaan lisätään juurisolmun alapuolelle uusi taso Uuden tason lisääminen: x a y x a z Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 7/30
B-puun operaatiot: Poisto Alkion poisto: Aloitetaan poistettavan alkion etsintä juurisolmusta Pidetään huoli, että mikään solmu ei tule liian vajaaksi Tarvittaessa alkioita siirretään haarautumissolmusta sen lapsisolmuun ja päinvastoin Tarvittaessa täsmälleen puoliksi täysiä sisarussolmuja yhdistetään yhdeksi solmuksi Lopetetaan kun alkio on poistettu, tai kun todetaan että alkiota ei ole puussa Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 8/30
B-puun operaatiot: Poisto Jos hakupolulla puoliksi täysi solmu, alkioita siirretään tai solmuja yhdistetään ennen kuin jatketaan Poistettava alkio lehtisolmussa: Poistetaan alkio (solmu ei tule vajaaksi) Poistettava alkio haarautumissolmussa: Etsitään poistettavan alkion edeltäjä tai seuraaja Poistetaan edeltäjä/seuraaja puusta rekursiivisesti Korvataan poistettava alkio edeltäjällä/seuraajalla Tai: Yhdistetään lapsisolmuja ennen kuin jatketaan Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 9/30
B-puun operaatiot: Poisto Hakupolulla on päästy solmuun x Mutta seuraava solmu y on puoliksi täysi Alkioiden siirto: x a y b z x b y a z (Vastaavasti, jos z on y:n vasemmalla puolella) Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 10/30
B-puun operaatiot: Poisto Hakupolulla on päästy solmuun x Mutta seuraava solmu y ja sen välittömät sisarussolmut puoliksi täysiä Solmujen yhdistäminen: y x a z y x a (Vastaavasti, jos z on y:n vasemmalla puolella) Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 11/30
Nelipuu Kaksiulotteisen tiedon tallennukseen Haarautumissolmuilla neljä alipuuta Esimerkiksi tallennetaan tason pisteitä neliön muotoisessa alueessa Jaetaan alue neljään yhtä suureen osaan koordinaattiakselien suuntaisilla suorilla Jatketaan jakoa, kunnes jokainen piste on yksin omassa neliön muotoisessa alueessaan Juurisolmu vastaa koko aluetta, muut solmut vastaavat yhtä jaossa muodostunutta neljännestä Pisteiden sisältämä tieto tallennetaan lehtisolmuihin Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 12/30
Esimerkki 3 2 6 1 7 4 5 8 4 1 2 3 6 7 5 8 Lapsisolmujen keskinäinen järjestys täytyy määritellä jollain yksikäsitteisellä tavalla Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 13/30
Nelipuun operaatiot Haku: Aloitetaan juurisolmusta Solmussa tutkitaan, mihin neljännekseen haettava piste kuuluu Siirrytään vastaavaan alipuuhun Jatketaan kunnes tullaan lehtisolmuun Tutkitaan, onko lehtisolmuun mahdollisesti tallennettu piste haettava piste Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 14/30
Nelipuun operaatiot Lisäys: Etsitään lehtisolmu, johon piste pitäisi sijoittaa Jos lehtisolmu tyhjä, tallennetaan piste sinne Jos lehtisolmussa on jo piste, jaetaan vastaava alue neljään osaan Tehdään solmusta haarautumissolmu ja lisätään sille neljä lapsisolmua Tarvittaessa jatketaan jakoa, kunnes pisteet yksin omissa alueissaan Tallennetaan pisteet vastaaviin lehtisolmuihin Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 15/30
Nelipuun operaatiot Poisto: Etsitään lehtisolmu, jossa poistettava piste on Jos poiston jälkeen jaetulle alueelle jäisi vain yksi piste, on kyseinen jako turha ja pienemmät alueet voidaan yhdistää takaisin isommaksi alueeksi Poistetaan vastaavat lapsisolmut, muutetaan vanhempi lehtisolmuksi ja tallennetaan yksinäinen piste sinne Tarvittaessa jatketaan alueiden yhdistämistä, kunnes kaikki turhat jaot on peruutettu Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 16/30
Nelipuun versioita Tasajaon asemesta pisteiden muodostama jako: Kun lisätään piste, jaetaan alue neljään osaan koordinaattiakselien suuntaisilla suorilla, jotka kulkevat kyseisen pisteen kautta Jokaisessa haarautumissolmussa myös kyseisen pisteen tiedot Muodostuvat alueet eivät neliötä vaan suorakulmioita Perusoperaatioiden toteutus jonkin verran hankalampaa kuin tasajaossa Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 17/30
Nelipuun versioita Jako vain kahteen osaan: Tehdään jako vuorotellen x-koordinaatin ja y-koordinaatin suhteen Jokaisella haarautumissolmulla vain kaksi lapsisolmua 2-d-puu Tehokkaampi muistitilan käyttö Voidaan yleistää useampiulotteiseen tapaukseen: Esimerkiksi kolmiulotteinen tieto Kuutio jaetaan kolmella tasolla kahdeksaan pienempään kuutioon 8-puu Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 18/30
Trie-rakenteet Merkkijonojen käsittelyyn soveltuva tietorakenne Sanan haku, sanan tai sanan alkuosan sovittaminen Aakkosto A, erilaisia merkkejä d kpl Merkkijonojen joukko S, merkkijonoja s kpl Ehto: Mikään joukon S merkkijono ei ole minkään toisen merkkijonon etuliite (alkuosa) Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 19/30
Standarditrie Joukon S standarditrie on järjestetty puu: Jokaiseen solmuun, paitsi juurisolmuun, liittyy yksi aakkoston merkki Haarautumissolmuissa lapsisolmujen järjestys määräytyy aakkoston luonnollisen järjestyksen mukaan Lehtisolmuja on s kpl Jokaiseen lehtisolmuun liittyy yksi merkkijono, joka saadaan kun kootaan yhteen juurisolmusta kyseiseen lehtisolmuun kulkevalla polulla olevat merkit Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 20/30
Standarditrie Polku juurisolmusta tasolle i saakka vastaa jonkin merkkijonon i:tä ensimmäistä merkkiä Puun korkeus sama kuin S:n pisimmän merkkijonon pituus Mikään merkkijono ei ole toisen merkkijonon etuliite Lehtisolmuihin liittyvät merkkijonot yksikäsitteisiä Haarautumissolmulla 1 d lapsisolmua Yksi lapsisolmu jokaista seuraavana esiintyvää eri merkkiä kohden Pahin tapaus: Millään kahdella merkkijonolla ei ole yhteistä ensimmäistä merkkiä Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 21/30
Esimerkki a l n e s t s e k t u s a i e ä i o t k a Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 22/30
Haku trie-rakenteesta Etsitään merkkijonoa puusta Aloitetaan juurisolmusta ja edetään merkki kerrallaan merkkiä vastaavaan alipuuhun Jos päädytään lehtisolmuun, merkkijono löytyi (tai sen alkuosa, jos merkkejä vielä jäljellä) Jos polku päättyy haarautumissolmuun, merkkijono ei ole puussa Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 23/30
Haku trie-rakenteesta Erilaisten merkkien lukumäärä d Yhdessä solmussa menee aika Θ(d) Haettavan merkkijonon pituus m Haun aikavaativuus Θ(dm) Joskus yhden solmun käsittely voidaan tehdä ajassa Θ(log d) tai Θ(1) Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 24/30
Trien muodostaminen Lisätään merkkijonot yksi kerrallaan Jäljitetään polkua niin pitkälle kuin mahdollista Jos merkkijono ei ole jo puussa, polku päättyy johonkin haarautumissolmuun Lisätään uusi alipuu ja luodaan uusi polku merkkijonon loppuosalle Polku päätetään lehtisolmuun, johon tulee merkkijonon viimeinen merkki Yhden merkkijonon lisäys Θ(dm) Koko trien muodostaminen Θ(dn), missä n on kaikkien merkkijonojen yhteispituus Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 25/30
Pakattu trie Standarditrie: Jos hakupolulla useita yksilapsisia solmuja peräkkäin, on vain yksi mahdollinen reitti edettävänä Haarautumissolmu v on tarpeeton, jos v:llä on vain yksi lapsisolmu v ei ole juurisolmu Peräkkäisten haarojen (v 0, v 1 ), (v 1, v 2 ),..., (v k 1, v k ) muodostama solmujen ketju on tarpeeton, jos v 1, v 2,..., v k 1 ovat tarpeettomia v 0 ja v k eivät ole tarpeettomia Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 26/30
Pakattu trie Trie-rakenteen pakkaaminen: Korvataan jokainen tarpeeton ketju yhdellä haaralla (v 0, v k ) Solmuissa v 1, v 2,..., v k 1 olevat merkit lisätään haaran loppusolmuun v k Haarautumissolmuilla vähintään kaksi lasta Solmuissa ei yksittäisiä merkkejä vaan merkkijonoja Solmujen lukumäärä suhteessa merkkijonojen lukumäärään (ei niiden yhteispituuteen) Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 27/30
Esimerkki le a n s esä k ot sa ti te u i ka Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 28/30
Pakattu trie Tehostetaan rakennetta edelleen: Tallennetaan merkkijonot erilliseen taulukkoon Puun solmuihin tallennetaan indeksejä (kokonaislukuja) Merkkijonot: S[0], S[1],..., S[s-1] Alimerkkijonot: S[i][j..k] (i:nnen merkkijonon merkit paikasta j paikkaan k) Alimerkkijonoon S[i][j..k] viitataan lyhyesti indeksikolmikolla (i,j,k) Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 29/30
Esimerkki 5,1,2 1,0,0 0,0,0 7,1,1 1,1,1 0,1,3 6,1,2 4,2,3 7,2,3 3,2,3 1,2,2 2,3,3 6,3,4 0 1 2 3 4 S[0] k e s ä S[1] a s u S[2] k o t i S[3] a s t e 0 1 2 3 4 S[4] a n s a S[5] a l e S[6] k o t k a S[7] a n t i Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 30/30