31.01.2015 Views

Luento 5 - Puurakenteet, binääripuu

Luento 5 - Puurakenteet, binääripuu

Luento 5 - Puurakenteet, binääripuu

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

A274101 TIETORAKENTEET<br />

JA ALGORITMIT<br />

PUURAKENTEET, BINÄÄRIPUU,<br />

TASAPAINOTETUT PUUT<br />

MIKÄ ON PUUTIETORAKENNE<br />

Esim.<br />

Viereinen kuva esittää erästä<br />

puuta. Tietojenkäsittelytieteessä<br />

puut ”kasvavat<br />

alaspäin”.<br />

<br />

<br />

<br />

Puu on abstrakti tietotyyppi<br />

Puun määrittely:<br />

Puu on joko tyhjä, tai se<br />

sisältää alkion, johon liittyy<br />

nolla tai useampia puita.<br />

Oheinen kuva on vain yksi<br />

tapa esittää puu<br />

D<br />

B<br />

E<br />

A<br />

F<br />

C<br />

G<br />

H<br />

I<br />

4.10.2005 KyAMK - TiRak, syksy 2005 2<br />

MIKÄ ON PUUTIETORAKENNE<br />

TERMINOLOGIAA<br />

Sama puu voidaan myös esittää<br />

seuraavasti:<br />

(A(B(D,E),C(F(I),G,H)))<br />

Tai seuraavasti:<br />

<br />

<br />

<br />

<br />

<br />

<br />

Käytetään jatkossa<br />

ensimmäistä esitystapaa,<br />

ellei toisin mainita<br />

Tieto sijoitetaan puussa<br />

solmuihin (node l.<br />

vertex)<br />

Solmuja yhdistävät sivut<br />

eli särmät (edge)<br />

Solmu, johon ei tule<br />

sivuja, on juuri (root)<br />

Solmut, joista ei lähde<br />

sivuja ovat lehtiä (leaf l.<br />

terminal node)<br />

Solmusta alkava puu on<br />

oksa tai alipuu (subtree,<br />

branch)<br />

OKSA,<br />

ALIPUU<br />

D<br />

B<br />

E<br />

LEHTI<br />

A<br />

JUURI<br />

SÄRMÄ<br />

SOLMU<br />

C<br />

F G H<br />

I<br />

4.10.2005 KyAMK - TiRak, syksy 2005 3<br />

4.10.2005 KyAMK - TiRak, syksy 2005 4


TERMINOLOGIAA<br />

TERMINOLOGIAA<br />

<br />

<br />

<br />

<br />

Toisiinsa yhdistetyt solmut<br />

n 1 , n 2 , n 3 , ... , n k muodostavat polun (path)<br />

Polun pituus (path-length) on k-1<br />

Puussa ei voi olla sulkeutuvia polkuja eli silmukoita<br />

Solmun kanssa samassa polussa oleva<br />

lähin juurenpuoleinen solmu on isä (father)<br />

lähin lehdenpuoleinen on lapsi (child)<br />

Polussa kauempana olevat ovat joko<br />

esivanhempia eli edeltäjiä (ancestor) tai<br />

jälkeläisiä eli seuraajia (descendant)<br />

Saman solmun lapset ovat sisaruksia (sibling)<br />

<br />

<br />

<br />

<br />

<br />

<br />

Solmun s syvyys eli taso (depth, level) on polun<br />

pituus juuresta s:ään Juuren syvyys = 0<br />

Solmun s korkeus (height) on pisimmän polun<br />

pituus s:stä lehteen Lehden korkeus on 0<br />

Puun korkeus on sen juuren korkeus<br />

Puun syvyys on sen syvimmän lehden syvyys<br />

Puun korkeus = puun syvyys<br />

Solmun aste on sen lapsiluku<br />

Nolla tai useampia puita muodostavat metsän<br />

(forest)<br />

4.10.2005 KyAMK - TiRak, syksy 2005 5<br />

4.10.2005 KyAMK - TiRak, syksy 2005 6<br />

TERMINOLOGIAA<br />

TERMINOLOGIAA<br />

Poikkeus esitystapaan:<br />

Jos solmuilla on suuresti vaihteleva määrä lapsia,<br />

muistinkäytön kannalta 1. kuvan mukainen puun<br />

esittäminen ei ole tehokas tapa.<br />

class TreeNode {<br />

Object item;<br />

TreeNode firstChild;<br />

TreeNode nextSibling;<br />

}<br />

B<br />

A<br />

C<br />

<br />

<br />

Linkitetyn listan tyyppisessä esitystavassa puun<br />

alkion tietotyyppi vaatisi useita osoitinkenttiä,<br />

joiden lukumäärä riippuu suurimmasta<br />

yksittäisen solmun lapsiluvusta<br />

Haitta voidaan korvata ratkaisulla, jossa<br />

isäsolmusta lähtee vain yksi osoitin lapsisolmuun<br />

(esikoinen) ja mahdollisesti toinen sisarukseen<br />

D<br />

E<br />

I<br />

F<br />

G<br />

H<br />

4.10.2005 KyAMK - TiRak, syksy 2005 7<br />

4.10.2005 KyAMK - TiRak, syksy 2005 8


BINÄÄRIPUU<br />

BINÄÄRIPUU<br />

Tärkein tai ainakin yleisin puurakenne on<br />

<strong>binääripuu</strong> (binary tree), jossa<br />

jokaisella solmulla on enintään kaksi<br />

lapsisolmua<br />

Erikoistapaus M-puusta (M-ary tree),<br />

missä jokaisen solmun lapsilukumäärä on<br />

enintään M<br />

Binääripuun solmusta siis lähtee<br />

enimmillään kaksi oksaa:<br />

vasen oksa ja oikea oksa<br />

Esim.<br />

Class Node {<br />

Object item;<br />

Node left;<br />

Node right;<br />

}<br />

Tietorakenne on hyvin<br />

samankaltainen kuin<br />

linkitetyn listan<br />

tietorakenne.<br />

…<br />

…<br />

…<br />

4.10.2005 KyAMK - TiRak, syksy 2005 9<br />

4.10.2005 KyAMK - TiRak, syksy 2005 10<br />

BINÄÄRIPUU<br />

BINÄÄRIPUU<br />

Esim. Lausekepuu<br />

Ohjelmointikielten kääntäjät käyttävät<br />

tehokkaasti hyväksi puutietorakenteita<br />

Tarkastellaan aritmeettisen lausekkeen<br />

saattamista muotoon, jossa sen arvo<br />

voidaan määrittää (evaluoida)<br />

Ensin kääntäjä selaa lausekkeen eritellen<br />

siitä yksiköt (tokens: operaattorit, vakiot,<br />

muuttujat, funktiot ym.)<br />

Selauksen yhteydessä kääntäjä rakentaa<br />

lausekepuun, jota seuraa koodin<br />

generointi ja evaluointi<br />

Esimerkiksi lauseketta<br />

( a + b * c ) + ( ( d * e + f ) * g )<br />

vastaa puu<br />

a<br />

+<br />

b<br />

+<br />

* +<br />

c *<br />

*<br />

f<br />

g<br />

4.10.2005 KyAMK - TiRak, syksy 2005 11<br />

d e<br />

4.10.2005 KyAMK - TiRak, syksy 2005 12


BINÄÄRIPUUN LÄPIKÄYNTI<br />

BINÄÄRIPUUN LÄPIKÄYNTI<br />

<br />

<br />

Binääripuu on rekursiivinen rakenne<br />

on luonnollista, että sitä käsittelevät funktiot ja<br />

metodit ovat myös rekursiivisia<br />

Seuraava Java-koodi esittää periaatteen, miten<br />

käydään <strong>binääripuu</strong>n jokaisessa solussa<br />

void traverse( Node p ) {<br />

if ( p == null ) {<br />

return;<br />

}<br />

visit( p ); /* Tehdään "visiitti"*/<br />

traverse( p.left );<br />

traverse( p.right );<br />

}<br />

<br />

<br />

<br />

<br />

<br />

<br />

Edellä kutsu visit( p ) edeltää rekursiivisia kutsuja<br />

Se voi olla myös niiden välissä tai niiden molempien jäljessä<br />

Riippuen kutsun paikasta saadaan kolme erilaista puun<br />

läpikäyntijärjestystä<br />

Esijärjestys (Preorder)<br />

1. Solmu<br />

2. Vasen oksa<br />

3. Oikea oksa<br />

Sisäjärjestys (Inorder)<br />

1. Vasen oksa<br />

2. Solmu<br />

3. Oikea oksa<br />

Jälkijärjestys (Postorder)<br />

1. Vasen oksa<br />

2. Oikea oksa<br />

3. Solmu<br />

4.10.2005 KyAMK - TiRak, syksy 2005 13<br />

4.10.2005 KyAMK - TiRak, syksy 2005 14<br />

BINÄÄRIPUUN LÄPIKÄYNTI<br />

Esimerkki: Lausekepuun läpikäyminen<br />

Kun edellä kuvattu lausekepuu käydään läpi<br />

järjestyksissä 1 - 3, saadaan lausekkeet:<br />

1. + + a * b c * + * d e f g (lauseke prefix-muodossa)<br />

2. a + b * c + d * e + f * g (lauseke infix-muodossa)<br />

3. a b c * + d e * f + g * + (lauseke postfix-muodossa)<br />

<br />

Huomataan, että yllättäen saadaan tuloksiksi<br />

aritmeettisen lausekkeen kolme eri esitystapaa<br />

BINÄÄRINEN HAKUPUU<br />

Binääristä hakupuuta (BST) käytetään tiedon<br />

hakemiseen<br />

Puu on kätevä tapa organisoida tietoaines<br />

etsittävä tieto löytyy nopeasti<br />

saadaan nopeasti selville, että tietoa ei löydy<br />

Tehokkuudeltaan haku BST:stä vastaa<br />

puolitushakua taulukosta<br />

BST:n koko voidaan kuitenkin räätälöidä<br />

tarkalleen datan koon mukaan<br />

Huom.<br />

Taulukossahan muistinvaraus pitää tehdä<br />

suurimman mahdollisen koon perusteella.<br />

4.10.2005 KyAMK - TiRak, syksy 2005 15<br />

4.10.2005 KyAMK - TiRak, syksy 2005 16


BINÄÄRINEN HAKUPUU<br />

BINÄÄRINEN HAKUPUU<br />

<br />

<br />

<br />

<br />

Olkoon tehtävänä järjestää tietoaines jonkin avaimen<br />

(key) perusteella<br />

Avain voi olla esimerkiksi struktuurin jokin kenttä<br />

Jos tietoalkiot ovat yksinkertaisia, vaikkapa<br />

kokonaislukuja, tieto itse on samalla avain<br />

BST on puu, jonka kaikille paitsi lehtisolmuille pätee:<br />

Vasemman oksan kaikki avaimet < solmun avain <<br />

oikean oksan kaikki avaimet<br />

Huom.<br />

Jos sallitaan avainarvojen toistuminen (ei kätevää<br />

hakusovelluksissa), tietorakenteeseen voidaan sijoittaa<br />

lisäkenttä, joka ilmoittaa lukumäärän ja varsinainen data sijoittaa<br />

esimerkiksi solmusta alkavaan järjestettyyn listaan.<br />

BST:n konstruointiperiaate on seuraava<br />

Ensimmäinen avainarvo sijoitetaan BST:n<br />

juureen<br />

Seuraava vasemmaksi tai oikeaksi lehdeksi<br />

riippuen onko se pienempi vai suurempi kuin<br />

juuren avain<br />

Kussakin vaiheessa seuraava avain sijoitetaan<br />

senhetkisen puun lehdeksi<br />

Paikka etsitään etenemällä juuresta lähtien ja<br />

kussakin solmussa valitsemalla vasen tai oikea<br />

oksa avaimen suuruuden perusteella<br />

4.10.2005 KyAMK - TiRak, syksy 2005 17<br />

4.10.2005 KyAMK - TiRak, syksy 2005 18<br />

BINÄÄRINEN HAKUPUU<br />

BINÄÄRINEN HAKUPUU<br />

Esimerkki:<br />

Konstruoidaan BST avaimista<br />

5, 3, 8, 2, 4, 1, 7, 6, 9<br />

(tässä järjestyksessä)<br />

5<br />

Jos n-solmuiseen BST:hen sijoitettavat avaimet ovat<br />

suuruusjärjestyksessä<br />

suurin mahdollinen korkeus, h = n – 1<br />

<br />

Pienin mahdollinen korkeus joudutaan laskemaan<br />

3<br />

8<br />

1 + 2 + 4 + 8 + ... + 2 h = n (vasen puoli geom. sarja)<br />

2<br />

4 7<br />

9<br />

2 h+1 - 1 = n ⇒ h = ⎡ log(n + 1) – 1 ⎤<br />

1 6<br />

Huom.<br />

Merkintä ⎡ ⎤ tarkoittaa pyöristämistä kokonaisluvuksi<br />

ylöspäin (ceil) ja ⎣ ⎦ vastaavasti alaspäin (floor).<br />

4.10.2005 KyAMK - TiRak, syksy 2005 19<br />

4.10.2005 KyAMK - TiRak, syksy 2005 20


BINÄÄRINEN HAKUPUU<br />

AVL-PUU JA MUITA<br />

TASAPAINOTETTUJA PUITA<br />

<br />

<br />

Tärkeimmät BST:lle tehtävät toimenpiteet ovat<br />

createBST - luo tyhjän BST:n<br />

find - etsii tietoa BST:stä avaimen perusteella<br />

findMin - etsii pienintä avainarvoa vastaavan tiedon<br />

findMax - etsii suurinta avainarvoa vastaavan tiedon<br />

insNode - lisää solmun BST:hen<br />

delNode - poistaa solmun BST:stä<br />

delBST - tuhoaa koko BST:n<br />

Voidaan osoittaa, että n-solmuisessa BST:ssä<br />

kaikkien näiden toimenpiteiden keskimääräinen<br />

suoritusaika on O(log n)<br />

<br />

<br />

<br />

<br />

BST:llä on mahdollista, että kaikki tai lähes kaikki<br />

solmut ovat joko vasemmassa tai oikeassa oksassa<br />

n-solmuisen BST:n korkeus on suurimmillaan n-1<br />

keskeisten toimenpiteiden suoritusaikaluokka O(n)<br />

Muodostuu ongelmaksi, jos BST:n koko on vaikkapa<br />

miljoona solmua<br />

Ongelman ratkaisemiseksi on kehitetty useita<br />

menetelmiä, joilla puu tasapainotetaan (balance)<br />

estetään O(n)-tapausten syntyminen<br />

Tärkeimmät tasapainotetut puutyypit ovat:<br />

1. AVL-puu<br />

2. Puna-musta puu<br />

3. Splay-tree<br />

4. B-tree<br />

4.10.2005 KyAMK - TiRak, syksy 2005 21<br />

4.10.2005 KyAMK - TiRak, syksy 2005 22<br />

AVL-PUU JA MUITA<br />

TASAPAINOTETTUJA PUITA<br />

AVL-PUU JA MUITA<br />

TASAPAINOTETTUJA PUITA<br />

<br />

<br />

AVL-puu (keksijät Adelson-Velskii ja Landels) on<br />

tasapainotettu BST<br />

AVL-puun jokaiselle solmulle pätee: vasemman oksan<br />

ja oikean oksan korkeudet eroavat enintään yhdellä<br />

Esimerkki:<br />

Kaksi BST:tä, joista toinen on AVL ja toinen ei.<br />

1<br />

3<br />

2<br />

6<br />

4 7<br />

AVL<br />

8<br />

4.10.2005 KyAMK - TiRak, syksy 2005 23<br />

1<br />

2<br />

4<br />

3 5<br />

6<br />

EI-AVL<br />

8<br />

Punamusta puu (Red Black Tree)<br />

BST, jossa jokaisella solmulla on väri<br />

Jokainen solmu on joko musta tai punainen<br />

Jokainen lehtisolmu on musta<br />

Jos solmu on punainen, sen molemmat<br />

lapsisolmut ovat mustia<br />

Jokainen polku solmusta lehteen sisältää yhtä<br />

monta mustaa solmua<br />

Nämä (oudot) ominaisuudet takaavat, että<br />

jokainen ne täyttävä puu on tasapainoinen<br />

Splay-tree, B-puu, …<br />

4.10.2005 KyAMK - TiRak, syksy 2005 24


AVL-PUU JA MUITA<br />

TASAPAINOTETTUJA PUITA<br />

SEURAAVALLA KERRALLA…<br />

<br />

<br />

<br />

<br />

<br />

B-puu (B-Tree) on periaatteeltaan erilainen kuin<br />

AVL ja punamusta puu<br />

Kyseessä ei ole BST. B-puun määritelmä on<br />

seuraava:<br />

B-puu on tasapainotettu hakupuu, missä<br />

jokaisella solmulla on vähintään m/2 ja enintään<br />

m lapsisolmua, missä m > 1 on kiinteä<br />

kokonaisluku.<br />

Juurella pitää olla vähintään 2 lasta.<br />

B-puu on varsin paljon käytetty. Sen etu BSTeihin<br />

verrattuna on se, että se voidaan tehdä<br />

matalaksi, jos m on suuri. Tosin tämä ei ole kovin<br />

käytännöllistä toteutuksen kannalta.<br />

Prioriteettijono<br />

Keko<br />

4.10.2005 KyAMK - TiRak, syksy 2005 25<br />

4.10.2005 KyAMK - TiRak, syksy 2005 26

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!