Algoritmit 2 Luento 5 Ti 26.3.2019 Timo Männikkö
Luento 5 Puurakenteet B-puu B-puun korkeus B-puun operaatiot B-puun muunnelmia Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 2/34
B-puu B-puut ovat tasapainoisia hakupuurakenteita Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 3/34
B-puu Motivaatio: Hyvin suuria tietomääriä ei välttämättä voida käsitellä keskusmuistissa yhtenä kokonaisuutena Tietoa joudutaan siirtämään keskusmuistin ja hitaampien ulkoisten muistien (levymuistit) välillä Tarkoituksena minimoida ulkoisiin muisteihin kohdistuvien I/O-operaatioiden lukumäärä Käytetään mm. suurten tietokantojen indekseinä suorasaannin toteuttamiseksi Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 4/34
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], missä i = 1, 2,..., x.num Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 5/34
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, 3,..., 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 2019 Luento 5 Ti 26.3.2019 6/34
B-puu Astetta m oleva B-puu: Arvo m Solmujen minimi- ja maksimikoko Alkioiden lukumäärä: Juurisolmussa vähintään 1, muissa solmuissa vähintään m 1 Jokaisessa solmussa enintään 2m 1 Osoittimien lukumäärä aina yhtä suurempi: Vähintään m (juurisolmussa 2), enintään 2m Solmu täysi: Maksimimäärä alkioita Solmu puoliksi täysi: Minimimäärä alkioita Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 7/34
B-puu Esimerkiksi m = 2: Alkioita solmuissa 1, 2 tai 3 Osoittimia haarautumissolmuissa 2, 3 tai 4 2-3-4-puu Esimerkiksi m = 3: Alkioita solmuissa 2 5 Osoittimia haarautumissolmuissa 3 6 Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 8/34
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 2019 Luento 5 Ti 26.3.2019 9/34
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 2019 Luento 5 Ti 26.3.2019 10/34
B-puun korkeus Todistus jatkuu: Yleisesti tasolla i vähintään 2m i 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 2019 Luento 5 Ti 26.3.2019 11/34
B-puun operaatioiden vaativuus Kuten järjestettyjen binääripuiden perusoperaatiot (haku, lisäys, poisto) Pahimmassa tapauksessa käydään läpi jokin polku juurisolmusta lehtisolmuun Puun korkeus määrää operaatioiden aikavaativuuden Edellinen lause Aikavaativuus Θ(log n) Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 12/34
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 5 Ti 26.3.2019 13/34
B-puun operaatiot: Haku hae(x, k) Jos x on haarautumissolmu Jos k = x.key[i] jollain 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 2019 Luento 5 Ti 26.3.2019 14/34
B-puun operaatiot: Haku (Jatkuu) Muuten x on lehtisolmu Jos k = x.key[i] jollain i, palautetaan haluttu tieto Muuten palautetaan tieto: ei löydy Haluttu tieto: Alkio, sen arvokenttä, tai osoitin alkioon Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 15/34
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 5 Ti 26.3.2019 16/34
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 5 Ti 26.3.2019 17/34
B-puun operaatiot: Lisäys Solmun y halkaisu: Olkoon a keskimmäinen alkio solmussa y Siirretään a:n oikealla puolella olevat alkiot uuteen solmuun z Jos y on haarautumissolmu, siirretään myös vastaavat lapsiosoittimet Alkion a vasemmalla puolella olevat alkiot ja vastaavat lapsiosoittimet jäävät solmuun y Siirretään a ylöspäin solmuun x paikkaan, johon se avaimensa mukaan kuuluu Lisätään x:ään uusi lapsiosoitin z:aan Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 18/34
B-puun operaatiot: Lisäys lisää_ei_täysi(x, k, v) Jos x on lehtisolmu Lisätään solmuun x.key[i] = k ja x.value[i] = v siten että alkioiden kasvava järjestys säilyy Muuten x on haarautumissolmu Etsitään y = x.child[i], jonne alkio kuuluu Jos y on täysi Halkaistaan y (ks. edellä) Jos k < a:n avain, lisää_ei_täysi(y, k, v) Muuten lisää_ei_täysi(z, k, v) Muuten y ei ole täysi, joten kutsutaan lisää_ei_täysi(y, k, v) Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 19/34
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 5 Ti 26.3.2019 20/34
B-puun operaatiot: Lisäys Uuden tason lisääminen solmun x alapuolelle: 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 Alkio a jää solmuun x Lisätään x:ään uudet lapsiosoittimet y:hyn ja z:aan Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 21/34
B-puun operaatiot: Lisäys lisää(x, k, v) Jos juurisolmu x on täysi Lisätään uusi taso (ks. edellä) Kutsutaan lisää_ei_täysi(x, k, v) Uuden tason lisääminen kasvattaa puun korkeutta Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 22/34
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 5 Ti 26.3.2019 23/34
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 5 Ti 26.3.2019 24/34
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 5 Ti 26.3.2019 25/34
B-puun operaatiot: Poisto Alkioiden siirto: Jos y on puoliksi täysi, mutta sen oikealla (vasemmalla) välittömällä sisarussolmulla z on ainakin yksi alkio yli minimin: Siirretään alkio a solmusta x solmun y viimeiseksi (ensimmäiseksi) alkioksi Siirretään a:n tilalle solmun z ensimmäinen (viimeinen) alkio b Jos y ja z haarautumissolmuja, siirretään myös solmun z ensimmäinen (viimeinen) lapsiosoitin y viimeiseksi (ensimmäiseksi) lapsiosoittimeksi Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 26/34
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 5 Ti 26.3.2019 27/34
B-puun operaatiot: Poisto Solmujen yhdistäminen: Jos y ja sen välittömät sisarussolmut puoliksi täysiä: Siirretään z:n alkiot solmuun y alkioiden järjestys säilyttäen Jos z haarautumissolmu, siirretään myös vastaavat lapsiosoittimet Siirretään alkio a solmusta x yhdistetyn solmun keskimmäiseksi alkioksi Poistetaan ylimääräinen lapsiosoitin solmusta x Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 28/34
B-puun operaatiot: Poisto Avainta k vastaavan alkion edeltäjä: Alkio, jonka avain k on k:ta lähinnä pienempi Suurin puussa oleva avain k siten, että k < k Siirrytään vasemmassa alipuussa jatkuvasti oikealle ja alaspäin niin pitkälle kuin päästään Avainta k vastaavan alkion seuraaja: Alkio, jonka avain k on k:ta lähinnä suurempi Pienin puussa oleva avain k siten, että k < k Siirrytään oikeassa alipuussa jatkuvasti vasemmalle ja alaspäin niin pitkälle kuin päästään Huom: Edeltäjä/seuraaja täytyy poistaa rekursiivisesti Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 29/34
B-puun operaatiot: Poisto poista(x, k) Jos x on lehtisolmu Jos k = x.key[i] jollain i, poistetaan alkio Muuten palautetaan tieto: ei löydy Muuten x on haarautumissolmu, tehdään seuraavaa: Jos x ei sisällä avainta k vastaavaa alkiota Etsitään y = x.child[i], jossa alkion pitäisi olla Jos y puoliksi täysi Siirretään alkioita tai yhdistetään solmuja (ks. edellä) Kutsutaan poista(y, k) (Jatkuu) Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 30/34
B-puun operaatiot: Poisto (Jatkuu, x on haarautumissolmu) Jos x sisältää avainta k vastaavan alkion a Olkoon y alkiota a edeltävä lapsisolmu, ja z alkiota seuraava lapsisolmu Jos y:ssä ainakin yksi alkio yli minimin Etsitään a:n edeltäjä alipuusta y Poistetaan edeltäjä rekursiivisesti, eli kutsutaan poista(y, k ) Sijoitetaan edeltäjä a:n tilalle solmuun x (Jatkuu) Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 31/34
B-puun operaatiot: Poisto (Jatkuu, x on haarautumissolmu) Jos y puoliksi täysi, mutta z:ssä ainakin yksi alkio yli minimin Etsitään a:n seuraaja alipuusta z Poistetaan seuraaja rekursiivisesti, eli kutsutaan poista(z, k ) Sijoitetaan seuraaja a:n tilalle solmuun x Jos sekä y että z puoliksi täysiä Yhdistetään y ja z (ks. edellä) Kutsutaan poista(y, k) Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 32/34
B-puun muunnelmia B+-puu: Kaikki varsinainen tieto lehtisolmuissa Haarautumissolmuissa vain avaimia ja osoittimia lapsisolmuihin Lehtisolmuissa osoittimet tietosisältöön Lehtisolmut linkitetty toisiinsa kahteen suuntaan linkitetyksi listaksi Mahdollistaa lehtisolmujen peräkkäiskäsittelyn Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 33/34
B-puun muunnelmia B*-puu: Solmut vähintään 2/3 täysiä Täysiä solmuja ei halkaista välittömästi, vaan ensin siirretään alkioita jompaankumpaan sisarussolmuun Jos sisarussolmutkin täysiä, lisätään uusi solmu ja jaetaan kahden täyden solmun alkiot suunnilleen tasan kolmen solmun kesken Keskimääräinen täyttösuhde parempi kuin tavallisella B-puulla Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 34/34