Algoritmit 2 Luento 5 Ti 28.3.2017 Timo Männikkö
Luento 5 Puurakenteet B-puu B-puun korkeus B-puun operaatiot Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 2/29
B-puu Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 3/29
B-puu B-puut ovat tasapainoisia hakupuurakenteita Hyvin suuria tietomääriä ei välttämättä voida käsitellä keskusmuistissa yhtenä kokonaisuutena Tietoa joudutaan siirtämään keskusmuistin ja ulkoisten muistien (levymuistit) välillä Tarkoituksena minimoida ulkoiseen muistiin kohdistuvien I/O-operaatioiden lukumäärä (sillä ne ovat hitaita) Käytetään mm. suurten tietokantojen indekseinä suorasaannin toteuttamiseksi Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 4/29
B-puu B-puu yleisesti: Solmut lehtisolmuja tai haarautumissolmuja Kaikki lehtisolmut ovat samalla syvyydellä h (= puun korkeus) Jokaisessa solmussa x on Solmuun tallennettujen alkioiden lukumäärä x.num Alkiot avaimen mukaan kasvavassa järjestyksessä Merkitään i:nnen alkion avainta x.key[i] ja arvoa x.value[i] Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 5/29
B-puu B-puu yleisesti (jatkuu): Jokaisessa haarautumissolmussa on lisäksi x.num + 1 kpl osoittimia x.child[i] Osoitin x.child[1] osoittaa alipuuhun, jonka alkioiden avaimet < x.key[1] Osoitin x.child[i], missä i = 2,..., x.num, osoittaa alipuuhun, jonka alkioiden avaimet k välillä x.key[i 1] < k < x.key[i] Osoitin x.child[x.num + 1] osoittaa alipuuhun, jonka alkioiden avaimet > x.key[x.num] Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 6/29
B-puu Astetta m oleva B-puu: Arvo m Solmujen minimi- ja maksimikoko Jokaisen solmun, paitsi juurisolmun, tulee olla vähintään puoliksi täynnä: Haarautumissolmussa alkioita m 1... 2m 1 osoittimia m... 2m Lehtisolmussa alkioita m 1... 2m 1 Jos juurisolmu on haarautumissolmu, sillä tulee olla vähintään 2 lasta Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 7/29
B-puu Esimerkiksi m = 2: Alkioita solmussa 1, 2, tai 3 Osoittimia haarautumissolmussa 2, 3 tai 4 2-3-4-puu Esimerkiksi m = 3: Alkioita solmussa 2 5 Osoittimia haarautumissolmussa 3 6 Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 8/29
Esimerkki 40 60 80 130 90 100 200 250 340 400 150 180 210 220 240 270 300 360 370 420 440 460 Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 9/29
B-puun korkeus Lause: Astetta m oleva B-puu, jossa on n alkiota Puun korkeus h log m ((n + 1)/2) Todistus: Juurisolmussa vähintään yksi alkio, muissa solmuissa vähintään m 1 alkiota Juurisolmulla vähintään 2 lasta, muilla solmuilla vähintään m lasta Tasolla 1 vähintään 2 solmua, tasolla 2 vähintään 2m solmua, tasolla 3 vähintään 2m 2 solmua, jne. Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 10/29
B-puun korkeus Todistus jatkuu: Yleisesti tasolla h vähintään 2m h 1 solmua, joissa vähintään m 1 alkiota n 1 + (m 1) = 1 + 2(m 1) h i=1 2m i 1 ( m h 1 m 1 ) = 2m h 1 m h (n + 1)/2 h log m ((n + 1)/2) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 11/29
B-puun operaatioiden vaativuus Pahimmassa tapauksessa käydään läpi polku juurisolmusta lehtisolmuun Puun korkeus määrää operaatioiden aikavaativuuden Edellinen lause Aikavaativuus Θ(log n) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 12/29
B-puun operaatiot: Haku Alkion haku: Aloitetaan juurisolmusta Etsitään avainta solmusta Jos alkio ei ole solmussa, siirrytään avainta vastaavaan alipuuhun Tarvittaessa jatketaan lehtisolmuun saakka Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 13/29
B-puun operaatiot: Haku hae(x, k) Jos x on haarautumissolmu Jos löytyy i, jolla k = x.key[i], palautetaan haluttu tieto Muuten, jos k < x.key[1], kutsutaan hae(x.child[1], k) Muuten, jos x.key[i 1] < k < x.key[i] jollain i, kutsutaan hae(x.child[i], k) Muuten on k > x.key[x.num], joten kutsutaan hae(x.child[x.num + 1], k) (Jatkuu) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 14/29
B-puun operaatiot: Haku (Jatkuu) Muuten x on lehtisolmu Jos löytyy i, jolla k = x.key[i], palautetaan haluttu tieto Muuten palautetaan tieto: ei löydy Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 15/29
B-puun operaatiot: Lisäys Alkion lisäys: Kuljetaan juurisolmusta kohti avainta vastaavaa lehtisolmua Jos polulla täysi solmu, halkaistaan se kahdeksi solmuksi Halkaisussa keskimmäisen alkion vasemmalla puolella olevat alkiot jäävät solmuun, oikealla puolella olevat siirretään uuteen solmuun Jos juurisolmu täynnä, muodostetaan sen alkioista uusi taso juuren alapuolelle Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 16/29
B-puun operaatiot: Lisäys lisää_ei_täysi(x, k, v) Jos x on lehtisolmu Lisätään alkio (k, v) solmuun x järjestys säilyttäen Muuten x on haarautumissolmu Etsitään w = x.child[i], jonne alkio kuuluu Jos w on täysi, halkaistaan se ja lisätään alkio (ks. jäljempänä) Muuten w ei ole täysi, joten kutsutaan lisää_ei_täysi(w, k, v) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 17/29
B-puun operaatiot: Lisäys Solmun w halkaisu ja alkion lisääminen: Olkoon a keskimmäinen alkio solmussa w Siirretään a:n oikealla puolella olevat alkiot uuteen solmuun y Jos w on haarautumissolmu, siirretään myös vastaavat lapsiosoittimet Siirretään a ylöspäin solmuun x ja lisätään x:ään uusi lapsiosoitin y:hyn Jos k < a.key, niin lisää_ei_täysi(w, k, v) Muuten kutsutaan lisää_ei_täysi(y, k, v) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 18/29
B-puun operaatiot: Lisäys Solmun halkaisu: w x a w x a y Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 19/29
B-puun operaatiot: Lisäys lisää(root, k, v) Jos x = root on täysi, lisätään uusi taso Olkoon a keskimmäinen alkio solmussa x Siirretään a:n vasemmalla puolella olevat alkiot uuteen solmuun y Siirretään a:n oikealla puolella olevat alkiot uuteen solmuun z Jos x on haarautumissolmu, siirretään myös vastaavat lapsiosoittimet Asetetaan x.child[1] = y ja x.child[2] = z Kutsutaan lisää_ei_täysi(x, k, v) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 20/29
B-puun operaatiot: Lisäys Uuden tason lisääminen: x a y x a z Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 21/29
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äynnä olevia sisarussolmuja yhdistetään yhdeksi solmuksi Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 22/29
B-puun operaatiot: Poisto poista(x, k) Jos x on lehtisolmu, poistetaan avainta k vastaava alkio x:stä Muuten x on haarautumissolmu, tehdään seuraavaa: Jos x ei sisällä avainta k vastaavaa alkiota Etsitään y = x.child[i], jonne alkio kuuluu Tarvittaessa siirretään alkioita tai yhdistetään solmuja (ks. jäljempänä) Kutsutaan poista(y, k) (Jatkuu) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 23/29
B-puun operaatiot: Poisto (Jatkuu) Jos x sisältää avainta k vastaavan alkion Olkoon y se x:n lapsi, joka edeltää k:ta Jos y:ssä ainakin yksi alkio yli minimin Etsitään k:n edeltäjä k alipuusta, jonka juuri on y Poistetaan k (rekursiivisesti) Sijoitetaan k:n tilalle k solmuun x (Jatkuu) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 24/29
B-puun operaatiot: Poisto (Jatkuu) Muuten y on täsmälleen puoliksi täynnä Olkoon z se x:n lapsi, joka seuraa k:ta Jos z:ssa ainakin yksi alkio yli minimin Etsitään k:n seuraaja k alipuusta, jonka juuri on z Poistetaan k (rekursiivisesti) Sijoitetaan k:n tilalle k solmuun x (Jatkuu) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 25/29
B-puun operaatiot: Poisto (Jatkuu) Muuten myös z on täsmälleen puoliksi täynnä Yhdistetään y ja z Poistetaan k (rekursiivisesti) Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 26/29
B-puun operaatiot: Poisto Alkioiden siirto: Jos y on täsmälleen puoliksi täynnä ja toisella välittömällä sisarussolmulla z on ainakin yksi alkio yli minimin Siirretään yksi alkio x:stä y:hyn Siirretään yksi alkio z:sta x:ään Jos y on haarautumissolmu, siirretään myös vastaavat lapsiosoittimet Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 27/29
B-puun operaatiot: Poisto Alkioiden siirto: Esimerkiksi, jos z on y:n oikealla puolella (Vastaavasti, jos z vasemmalla puolella) x a y b z x b y a z Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 28/29
B-puun operaatiot: Poisto Solmujen yhdistäminen: Jos sekä y että molemmat välittömät sisarussolmut täsmälleen puoliksi täynnä, yhdistetään y toisen sisaruksen kanssa y x a z x a Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 29/29