Luento 5 - Puurakenteet, binääripuu
Luento 5 - Puurakenteet, binääripuu
Luento 5 - Puurakenteet, binääripuu
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