A274101 TIETORAKENTEET JA ALGORITMIT PUURAKENTEET, BINÄÄRIPUU, TASAPAINOTETUT PUUT MIKÄ ON PUUTIETORAKENNE? Esim. Viereinen kuva esittää erästä puuta. Tietojenkäsittelytieteessä puut kasvavat alaspäin. Puu on abstrakti tietotyyppi Puun määrittely: Puu on joko tyhjä, tai se sisältää alkion, johon liittyy nolla tai useampia puita. Oheinen kuva on vain yksi tapa esittää puu D B E A F C G H I 4.10.2005 KyAMK - TiRak, syksy 2005 2 MIKÄ ON PUUTIETORAKENNE? Sama puu voidaan myös esittää seuraavasti: (A(B(D,E),C(F(I),G,H))) Tai seuraavasti: Käytetään jatkossa ensimmäistä esitystapaa, ellei toisin mainita Tieto sijoitetaan puussa solmuihin (node l. vertex) Solmuja yhdistävät sivut eli särmät (edge) Solmu, johon ei tule sivuja, on juuri (root) Solmut, joista ei lähde sivuja ovat lehtiä (leaf l. terminal node) Solmusta alkava puu on oksa tai alipuu (subtree, branch) OKSA, ALIPUU D B E LEHTI A JUURI SÄRMÄ SOLMU C F G H I 4.10.2005 KyAMK - TiRak, syksy 2005 3 4.10.2005 KyAMK - TiRak, syksy 2005 4
Toisiinsa yhdistetyt solmut n 1, n 2, n 3,..., n k muodostavat polun (path) Polun pituus (path-length) on k-1 Puussa ei voi olla sulkeutuvia polkuja eli silmukoita Solmun kanssa samassa polussa oleva lähin juurenpuoleinen solmu on isä (father) lähin lehdenpuoleinen on lapsi (child) Polussa kauempana olevat ovat joko esivanhempia eli edeltäjiä (ancestor) tai jälkeläisiä eli seuraajia (descendant) Saman solmun lapset ovat sisaruksia (sibling) Solmun s syvyys eli taso (depth, level) on polun pituus juuresta s:ään Juuren syvyys = 0 Solmun s korkeus (height) on pisimmän polun pituus s:stä lehteen Lehden korkeus on 0 Puun korkeus on sen juuren korkeus Puun syvyys on sen syvimmän lehden syvyys Puun korkeus = puun syvyys Solmun aste on sen lapsiluku Nolla tai useampia puita muodostavat metsän (forest) 4.10.2005 KyAMK - TiRak, syksy 2005 5 4.10.2005 KyAMK - TiRak, syksy 2005 6 Poikkeus esitystapaan: Jos solmuilla on suuresti vaihteleva määrä lapsia, muistinkäytön kannalta 1. kuvan mukainen puun esittäminen ei ole tehokas tapa. class TreeNode { Object item; TreeNode firstchild; TreeNode nextsibling; B A C Linkitetyn listan tyyppisessä esitystavassa puun alkion tietotyyppi vaatisi useita osoitinkenttiä, joiden lukumäärä riippuu suurimmasta yksittäisen solmun lapsiluvusta Haitta voidaan korvata ratkaisulla, jossa isäsolmusta lähtee vain yksi osoitin lapsisolmuun (esikoinen) ja mahdollisesti toinen sisarukseen D E I F G H 4.10.2005 KyAMK - TiRak, syksy 2005 7 4.10.2005 KyAMK - TiRak, syksy 2005 8
BINÄÄRIPUU BINÄÄRIPUU Tärkein tai ainakin yleisin puurakenne on binääripuu (binary tree), jossa jokaisella solmulla on enintään kaksi lapsisolmua Erikoistapaus M-puusta (M-ary tree), missä jokaisen solmun lapsilukumäärä on enintään M Binääripuun solmusta siis lähtee enimmillään kaksi oksaa: vasen oksa ja oikea oksa Esim. Class Node { Object item; Node left; Node right; Tietorakenne on hyvin samankaltainen kuin linkitetyn listan tietorakenne. 4.10.2005 KyAMK - TiRak, syksy 2005 9 4.10.2005 KyAMK - TiRak, syksy 2005 10 BINÄÄRIPUU BINÄÄRIPUU Esim. Lausekepuu Ohjelmointikielten kääntäjät käyttävät tehokkaasti hyväksi puutietorakenteita Tarkastellaan aritmeettisen lausekkeen saattamista muotoon, jossa sen arvo voidaan määrittää (evaluoida) Ensin kääntäjä selaa lausekkeen eritellen siitä yksiköt (tokens: operaattorit, vakiot, muuttujat, funktiot ym.) Selauksen yhteydessä kääntäjä rakentaa lausekepuun, jota seuraa koodin generointi ja evaluointi Esimerkiksi lauseketta ( a + b * c ) + ( ( d * e + f ) * g ) vastaa puu a + b + * + c * * f g 4.10.2005 KyAMK - TiRak, syksy 2005 11 d e 4.10.2005 KyAMK - TiRak, syksy 2005 12
BINÄÄRIPUUN LÄPIKÄYNTI Binääripuu on rekursiivinen rakenne on luonnollista, että sitä käsittelevät funktiot ja metodit ovat myös rekursiivisia Seuraava Java-koodi esittää periaatteen, miten käydään binääripuun jokaisessa solussa void traverse( Node p ) { if ( p == null ) { return; visit( p ); /* Tehdään "visiitti"*/ traverse( p.left ); traverse( p.right ); BINÄÄRIPUUN LÄPIKÄYNTI Edellä kutsu visit( p ) edeltää rekursiivisia kutsuja Se voi olla myös niiden välissä tai niiden molempien jäljessä Riippuen kutsun paikasta saadaan kolme erilaista puun läpikäyntijärjestystä Esijärjestys (Preorder) 1. Solmu 2. Vasen oksa 3. Oikea oksa Sisäjärjestys (Inorder) 1. Vasen oksa 2. Solmu 3. Oikea oksa Jälkijärjestys (Postorder) 1. Vasen oksa 2. Oikea oksa 3. Solmu 4.10.2005 KyAMK - TiRak, syksy 2005 13 4.10.2005 KyAMK - TiRak, syksy 2005 14 BINÄÄRIPUUN LÄPIKÄYNTI Esimerkki: Lausekepuun läpikäyminen Kun edellä kuvattu lausekepuu käydään läpi järjestyksissä 1-3, saadaan lausekkeet: 1. + + a * b c * + * d e f g (lauseke prefix-muodossa) 2. a + b * c + d * e + f * g (lauseke infix-muodossa) 3. a b c * + d e * f + g * + (lauseke postfix-muodossa) Huomataan, että yllättäen saadaan tuloksiksi aritmeettisen lausekkeen kolme eri esitystapaa Binääristä hakupuuta (BST) käytetään tiedon hakemiseen Puu on kätevä tapa organisoida tietoaines etsittävä tieto löytyy nopeasti saadaan nopeasti selville, että tietoa ei löydy Tehokkuudeltaan haku BST:stä vastaa puolitushakua taulukosta BST:n koko voidaan kuitenkin räätälöidä tarkalleen datan koon mukaan Huom. Taulukossahan muistinvaraus pitää tehdä suurimman mahdollisen koon perusteella. 4.10.2005 KyAMK - TiRak, syksy 2005 15 4.10.2005 KyAMK - TiRak, syksy 2005 16
Olkoon tehtävänä järjestää tietoaines jonkin avaimen (key) perusteella Avain voi olla esimerkiksi struktuurin jokin kenttä Jos tietoalkiot ovat yksinkertaisia, vaikkapa kokonaislukuja, tieto itse on samalla avain BST on puu, jonka kaikille paitsi lehtisolmuille pätee: Vasemman oksan kaikki avaimet < solmun avain < oikean oksan kaikki avaimet Huom. Jos sallitaan avainarvojen toistuminen (ei kätevää hakusovelluksissa), tietorakenteeseen voidaan sijoittaa lisäkenttä, joka ilmoittaa lukumäärän ja varsinainen data sijoittaa esimerkiksi solmusta alkavaan järjestettyyn listaan. BST:n konstruointiperiaate on seuraava Ensimmäinen avainarvo sijoitetaan BST:n juureen Seuraava vasemmaksi tai oikeaksi lehdeksi riippuen onko se pienempi vai suurempi kuin juuren avain Kussakin vaiheessa seuraava avain sijoitetaan senhetkisen puun lehdeksi Paikka etsitään etenemällä juuresta lähtien ja kussakin solmussa valitsemalla vasen tai oikea oksa avaimen suuruuden perusteella 4.10.2005 KyAMK - TiRak, syksy 2005 17 4.10.2005 KyAMK - TiRak, syksy 2005 18 Esimerkki: Konstruoidaan BST avaimista 5, 3, 8, 2, 4, 1, 7, 6, 9 (tässä järjestyksessä) 5 Jos n-solmuiseen BST:hen sijoitettavat avaimet ovat suuruusjärjestyksessä suurin mahdollinen korkeus, h = n 1 Pienin mahdollinen korkeus joudutaan laskemaan 3 8 1 + 2 + 4 + 8 +... + 2 h = n (vasen puoli geom. sarja) 2 4 7 9 2 h+1-1 = n h = log(n + 1) 1 1 6 Huom. Merkintä tarkoittaa pyöristämistä kokonaisluvuksi ylöspäin (ceil) ja vastaavasti alaspäin (floor). 4.10.2005 KyAMK - TiRak, syksy 2005 19 4.10.2005 KyAMK - TiRak, syksy 2005 20
Tärkeimmät BST:lle tehtävät toimenpiteet ovat createbst - luo tyhjän BST:n find - etsii tietoa BST:stä avaimen perusteella findmin - etsii pienintä avainarvoa vastaavan tiedon findmax - etsii suurinta avainarvoa vastaavan tiedon insnode - lisää solmun BST:hen delnode - poistaa solmun BST:stä delbst - tuhoaa koko BST:n Voidaan osoittaa, että n-solmuisessa BST:ssä kaikkien näiden toimenpiteiden keskimääräinen suoritusaika on O(log n) AVL-PUU JA MUITA BST:llä on mahdollista, että kaikki tai lähes kaikki solmut ovat joko vasemmassa tai oikeassa oksassa n-solmuisen BST:n korkeus on suurimmillaan n-1 keskeisten toimenpiteiden suoritusaikaluokka O(n) Muodostuu ongelmaksi, jos BST:n koko on vaikkapa miljoona solmua Ongelman ratkaisemiseksi on kehitetty useita menetelmiä, joilla puu tasapainotetaan (balance) estetään O(n)-tapausten syntyminen Tärkeimmät tasapainotetut puutyypit ovat: 1. AVL-puu 2. Puna-musta puu 3. Splay-tree 4. B-tree 4.10.2005 KyAMK - TiRak, syksy 2005 21 4.10.2005 KyAMK - TiRak, syksy 2005 22 AVL-PUU JA MUITA AVL-puu (keksijät Adelson-Velskii ja Landels) on tasapainotettu BST AVL-puun jokaiselle solmulle pätee: vasemman oksan ja oikean oksan korkeudet eroavat enintään yhdellä Esimerkki: Kaksi BST:tä, joista toinen on AVL ja toinen ei. 1 3 2 6 4 7 AVL 8 4.10.2005 KyAMK - TiRak, syksy 2005 23 1 2 4 3 5 6 EI-AVL 8 AVL-PUU JA MUITA Punamusta puu (Red Black Tree) BST, jossa jokaisella solmulla on väri Jokainen solmu on joko musta tai punainen Jokainen lehtisolmu on musta Jos solmu on punainen, sen molemmat lapsisolmut ovat mustia Jokainen polku solmusta lehteen sisältää yhtä monta mustaa solmua Nämä (oudot?) ominaisuudet takaavat, että jokainen ne täyttävä puu on tasapainoinen Splay-tree, B-puu, 4.10.2005 KyAMK - TiRak, syksy 2005 24
AVL-PUU JA MUITA SEURAAVALLA KERRALLA B-puu (B-Tree) on periaatteeltaan erilainen kuin AVL ja punamusta puu Kyseessä ei ole BST. B-puun määritelmä on seuraava: B-puu on tasapainotettu hakupuu, missä jokaisella solmulla on vähintään m/2 ja enintään m lapsisolmua, missä m > 1 on kiinteä kokonaisluku. Juurella pitää olla vähintään 2 lasta. B-puu on varsin paljon käytetty. Sen etu BSTeihin verrattuna on se, että se voidaan tehdä matalaksi, jos m on suuri. Tosin tämä ei ole kovin käytännöllistä toteutuksen kannalta. Prioriteettijono Keko 4.10.2005 KyAMK - TiRak, syksy 2005 25 4.10.2005 KyAMK - TiRak, syksy 2005 26