Tietorakenteet ja algoritmit Puurakenteet Ari Korhonen



Samankaltaiset tiedostot
A TIETORAKENTEET JA ALGORITMIT

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Miten käydä läpi puun alkiot (traversal)?

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

Lisää segmenttipuusta

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Luento 7 Ti Timo Männikkö

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Algoritmit 1. Luento 8 Ke Timo Männikkö

Muita linkattuja rakenteita

1.1 Tavallinen binäärihakupuu

Algoritmit 2. Luento 2 To Timo Männikkö

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 8 Ke Timo Männikkö

Kysymyksiä koko kurssista?

Diskreetit rakenteet

3. Binääripuu, Java-toteutus

Algoritmit 1. Luento 6 Ke Timo Männikkö

Koe ma 1.3 klo salissa A111, koeaika kuten tavallista 2h 30min

Binäärihaun vertailujärjestys

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 2. Luento 4 Ke Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet, laskuharjoitus 6,

Algoritmit 2. Luento 4 To Timo Männikkö

Kierros 4: Binäärihakupuut

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Johdatus diskreettiin matematiikkaan Harjoitus 7,

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

CS-A1140 Tietorakenteet ja algoritmit

TIE Tietorakenteet ja algoritmit 261

Algoritmit ja tietorakenteet Copyright Hannu Laine. 1, kun n= 0. n*(n-1)!, kun n>0;

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

9/18/02 1. Tietorakenteet ja algoritmit Y. Syksy Dipoli T

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

puuta tree hierarkkinen hierarchical

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

Luento 3: Tietorakenteiden esittäminen

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

T /253 Tietorakenteet ja algoritmit T/Y

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

1 Puu, Keko ja Prioriteettijono

TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Tietorakenteet ja algoritmit

Muuttujien roolit Kiintoarvo cin >> r;

Kierros 3: Puut. Tommi Junttila. Aalto University School of Science Department of Computer Science

Algoritmit 2. Luento 6 To Timo Männikkö

4. Joukkojen käsittely

Tietorakenteet ja algoritmit

10. Painotetut graafit

7. Tasapainoitetut hakupuut

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 1. Luento 4 Ke Timo Männikkö

CS-A1140 Tietorakenteet ja algoritmit

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

14 Tasapainotetut puurakenteet

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Tietorakenteet ja algoritmit

18. Abstraktit tietotyypit 18.1

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta

Tietorakenteita 163. Yhteen suuntaan linkitetyn listan rakenne on siis seuraavan kuvan kaltainen:

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

Luku 8. Aluekyselyt. 8.1 Summataulukko

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Tietorakenteet ja algoritmit. Verkot. Ari Korhonen

Tarkennamme geneeristä painamiskorotusalgoritmia

Datatähti 2019 loppu

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1

Luento 6. June 1, Luento 6

Tietorakenteet ja algoritmit. Kertaus. Ari Korhonen

Lyhyt kertaus osoittimista

Tiraka, yhteenveto tenttiinlukua varten

Paikkatiedon käsittely 6. Kyselyn käsittely

Algoritmit 1. Luento 9 Ti Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

B + -puut. Kerttu Pollari-Malmi

TAMPEREEN TEKNILLINEN YLIOPISTO

Algoritmit 1. Demot Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Aluksi Kahden muuttujan lineaarinen epäyhtälö

9.3 Algoritmin valinta

Transkriptio:

Tietorakenteet ja algoritmit Puurakenteet ri Korhonen 13.10.2015 Tietorakenteet ja algoritmit 1

7. PUURKNTT 7.1 Käsitteistöä 7.2 Binääripuu (binary tree) 7.3 Puiden esitys- ja toteutustapoja 7.4 Puussa kulkeminen (traversing a tree) 7.5 Puiden sovelluksia 13.10.2015 Tietorakenteet ja algoritmit 2

7.1 Käsitteistöä Puurakenteen perusmalli on sukupuu ylös juuri (root) alas B C G isä (parent) D H L lapsi (child) 13.10.2015 Tietorakenteet ja algoritmit 3

Käsitteitä ja ominaisuuksia: Solmu (node, vertex) on puuhun kuuluva alkio, johon voidaan tallettaa tietoa Särmä, kaari (edge, arc) on suora yhteys kahden solmun välillä Juuri (root) on puun ylin solmu Solmun lähin edeltäjä on sen isä (father, dad, parent). Kauemmista edeltäjistä käytetään nimeä isoisä, esi-isä tai edeltäjä (grandfather, ancestor) Solmun lähinnä alemmat seuraajat ovat sen lapsia (children). Näiden lapset vastaavasti lapsenlapsia (grandchildren) Kullakin solmulla on vain yksi isä ylös juuri (root) Juurella ei ole isää alas B C G isä (parent) D H L lapsi (child) 13.10.2015 Tietorakenteet ja algoritmit 4

Solmulla voi olla 0-N kpl lapsia. Yleisessä puussa lasten määrää ei ole rajoitettu Saman isän lapset ovat toistensa sisaruksia (sibling) Lehti (leaf, external node) on solmu, jolla ei ole lapsia Muut solmut ovat puun sisäsolmuja (internal node) Lehdet ovat joskus rakenteeltaan erilaisia kuin sisäsolmut Polku (path) on yhteys kahden solmun välillä Juuresta mihin tahansa solmuun on vain yksi polku. Vastaavasti jokaisesta solmusta on vain yksi polku mihin tahansa toiseen solmuun. Puussa ei ole silmukoita. Jokainen solmu on oman alipuunsa (subtree) juuri ylös alas juuri (root) B C G isä (parent) Puiden joukko on metsä (forest) D H L lapsi (child) 13.10.2015 Tietorakenteet ja algoritmit 5

Järjestetyssä puussa (ordered tree) lasten järjestys on määrätty Vasen, Oikea nsimmäinen, Toinen,...,Viimeinen Järjestys liittyy puun rakenteeseen. Se I tarkoita sitä että solmuihin liittyvä tieto olisi järjestyksessä! Solmu on tasolla N (level N), jos polulla siitä juureen on N solmua. Juuren taso on 0. Puun korkeus (height) on sen tasojen määrä, ts. pisimmän juuresta lehteen ulottuvan polun pituus ylös juuri (root) alas B C G isä (parent) D H L lapsi (child) 13.10.2015 Tietorakenteet ja algoritmit 6

Lause: Jos puussa on N solmua niin siinä on N-1 särmää Todistus: Jokainen solmu kytkeytyy yhdellä särmällä isäsolmuunsa Juurisolmulla ei ole isää Puun rekursiivinen määritelmä: Puu on joko yksittäinen solmu tai juurisolmu, joka on kytketty joukkoon muita puita (= alipuita ) lipuiden tulee olla pareittain pistevieraita ylös alas juuri (root) B C G isä (parent) D H L lapsi (child) 13.10.2015 Tietorakenteet ja algoritmit 7

Usein käytetty merkintä: Solmut palloja lipuut kolmioita P U U K4.2 l i puu l i puu 13.10.2015 Tietorakenteet ja algoritmit 8

7.2 Binääripuu (binary tree) Hyvin tärkeä puiden perustyyppi. Binääripuu (binary tree) on järjestetty puu, jossa jokaisella solmulla on täsmälleen kaksi lasta: vasen ja oikea (voivat olla tyhjiä) Binääripuu on täydellinen (complete), jos alinta tasoa lukuunottamatta kaikki tasot ovat täynnä ja alimmalla tasolla solmut ovat vasemmassa reunassa 13.10.2015 Tietorakenteet ja algoritmit 9

7.3 Puiden esitys- ja toteutustapoja 7.3.1 Dynaaminen tietorakenne struct node { char key; struct node *left; struct node *right; }; left key right typedef struct node * link; Lehtisolmujen linkit voidaan asettaa arvoon NULL, joskin erillisen Z-solmun käyttö on parempi ratkaisu 13.10.2015 Tietorakenteet ja algoritmit 10

Sama Javalla class TreeNode { private Object data; private TreeNode left, right; } TreeNode (Object element) { data = element; left = null; right = null; } TreeNode root, p, q; 13.10.2015 Tietorakenteet ja algoritmit 11

Joskus juuren käsittely joudutaan suorittamaan erikoistapauksena sim. jos kaikkiin solmuihin kohdistettava operaatio viittaa myös solmun isään Kannattaa määritellä ylimääräinen Head-solmu, josta on viittaus juureen Vrt. linkitetty lista Head K4.4 13.10.2015 Tietorakenteet ja algoritmit 12

Samoin voidaan määritellä erityinen z-solmu, johon tyhjät alipuut eli lehtisolmujen linkit viittaavat (Sedgewick: lgorithms) : z-solmuja on vain yksi kappale Head z-solmun linkit viittaavat z-solmuun itseensä K4.5 Kaikki kerralla käytössä olevat dynaamiset tietorakenteet voivat käyttää samaa z-solmua Z 13.10.2015 Tietorakenteet ja algoritmit 13

Nyt esim voidaan luoda tyhjä puu ja käsitellä sitä samoilla rutiineilla kuin muitakin puita: link Z = malloc(sizeof(struct node)); Z->left = Z; Z->right = Z; link Head = malloc(sizeof(struct node)); Head->left = Z; Head->right = Z; Head K4.6 Z 13.10.2015 Tietorakenteet ja algoritmit 14

Tämä esitystapa mahdollistaa liikkumisen puussa vain alaspäin Jos halutaan liikkua myös ylös, voidaan lisätä kolmas linkki, dad, joka osoittaa solmun isään class TreeNode { private Object data; private TreeNode left, right, dad; } TreeNode (Object element) { data = element; left = null; right = null; dad = null; } 13.10.2015 Tietorakenteet ja algoritmit 15

Luentotehtävä 1. Jos binääripuussa on N (ei-tyhjää) alkiota eli solmua, niin mikä on sen korkeus a) enintään? b) vähintään? 2. Jos binääripuun korkeus on k, niin kuinka monta alkiota siinä on a) enintään? b) vähintään? 13.10.2015 Tietorakenteet ja algoritmit 16

7.3.2 Taulukkoesitys Täydellinen binääripuu voidaan esittää yksinkertaisessa taulukossa (muille binääripuille näin ei voi tehdä) Juuri on taulukon 1. alkiossa Paikassa k olevan solmun isä on paikassa k DIV 2 Paikassa k olevan solmun lapset ovat paikoissa 2*k ja 2*k+1 Viittauksille lapsiin (left, right) ei siis varata lainkaan tilaa sityksessä voi liikkua sekä ylös että alas puussa 13.10.2015 Tietorakenteet ja algoritmit 17

7.3.3 Isä-linkit tai -taulukko yleiselle puulle Jos puussa tarvitsee liikkua vain ylöspäin, riittää kussakin solmusta tieto sen isästä. Tämä voidaan toteuttaa joko dynaamisena tietorakenteena tai taulukkona. struct node { char key; struct node *dad; }; S R T typedef struct node * link; M P L k!!1 2 3 4 5 6 7 8 9 10 11!! a[k]!! S M P L T R! dad[k]!3 3 10 8 8 8 8 9 10-1 10! 13.10.2015 Tietorakenteet ja algoritmit 18

Jos yleisessä puussa halutaan liikkua alaspäin, kytketään kunkin solmun jälkeläiset linkitetyksi listaksi. Siten voidaan varata tilaa tarpeen mukaan. Solmusta on osoitin vasemman puolimmaiseen lapseen ja lähinnä oikealla olevaan veljeen S R T struct node { char key; struct node *First_child; struct node *Next_sibling; }; M P L typedef struct node * link; => sitysmuoto palautuu binääripuuksi! 13.10.2015 Tietorakenteet ja algoritmit 19

7.4 Puussa kulkeminen (traversing a tree) Monessa tilanteessa pitää pystyä käymään läpi (traverse) kaikki puussa olevat alkiot Läpikäyntijärjestyksiä on useita esijärjestys (preorder) sisäjärjestys (inorder) jälkijärjestys (postorder) tasojärjestys (level order) 13.10.2015 Tietorakenteet ja algoritmit 20

sijärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä: juuri - vasen alipuu - oikea alipuu P M S L R T Sisäjärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä: vasen alipuu - juuri - oikea alipuu S M P L T R P M L S R T 13.10.2015 Tietorakenteet ja algoritmit 21

Jälkijärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä: vasen alipuu - oikea alipuu juuri S M T R L P Tasojärjestyksessä puu käydään läpi ylhäältä alaspäin kukin taso kerrallaan vasemmalta oikealle P M L S R T P M L S R T 13.10.2015 Tietorakenteet ja algoritmit 22

Muistisääntö : Piirretään viiva juuren päältä lähtien vastapäivään puun ympäri läheltä liipaten, tulostetaan solmu kun se ohitetaan vasemmalta => sijärjestys ohitetaan alta => Sisäjärjestys ohitetaan oikealta => Jälkijärjestys P M L S R T 13.10.2015 Tietorakenteet ja algoritmit 23

Kolmen ensimmäisen läpikäyntitavan implementaatio on helpointa tehdä rekursion avulla P void traverse_preorder(link t) { if (t!= NULL) { visit(t); traverse_preorder(t->left); traverse_preorder(t->right); } } S M L T R Osoitinmuuttujan t rooli läpikäyntialgoritmeissa on kulkija. Kentät t- >left ja t->right ovat kiintoarvoja. 13.10.2015 Tietorakenteet ja algoritmit 24

void traverse_inorder(link t) { if (t!= NULL) { traverse_inorder(t->left); visit(t); traverse_inorder(t->right); } S } M P L R void traverse_postorder(link t) { if (t!= NULL) { traverse_postorder(t->left); traverse_postorder(t->right); visit(t); } } T 13.10.2015 Tietorakenteet ja algoritmit 25

sijärjestys pinon avulla: void traverse_preorder(link t) { push(t); do { t = pop(); P M if (t!= NULL) { S visit(t); push(t->right); push(t->left); } } while (!stack_empty()); } L Tasojärjestyksen implementointi käy helposti jonorakenteen avulla: void traverse_levelorder(link t) { put(t); do { t = get(); if (t!= NULL) { } T R visit(t); put(t->left); put(t->right); } } while (!queue_empty()); Operaatiot push() ja pop() kohdistuvat pinoon, jonka rooli on säiliö. 13.10.2015 Tietorakenteet ja algoritmit 26

Luentotehtävä sitä jonon sisältö, kun oheinen puu käydään läpi tasojärjestyksessä annetulla algoritmilla P Parityöskentely sallittua! M L void traverse_levelorder(link t) { put(t); do { t = get(); if (t!= NULL) { visit(t); put(t->left); put(t->right); } } while (!queue_empty()); } S sitä jonon sisältö jokaisen iteraation alussa: P M L L S T R 13.10.2015 Tietorakenteet ja algoritmit 27

Luentotehtävä sitä jonon sisältö, kun oheinen puu käydään läpi tasojärjestyksessä annetulla algoritmilla M P L S void traverse_levelorder(link t) { put(t); do { t = get(); if (t!= NULL) { visit(t); put(t->left); put(t->right); } } while (!queue_empty()); } P M L L S S R R R T T R P M L S R T 13.10.2015 Tietorakenteet ja algoritmit 28

Yleisen puun läpikäynnissä em. algoritmit yleistetään sijärjestys R S R T M P L S T Jälkijärjestys M P L S M P L T R Sisäjärjestys ei ole yksiselitteinen. sim. juuri lasketaan 1. lapsen jälkeen, mutta toteutus voisi olla toinenkin. Koska yleinen puu on palautettavissa binääripuuksi, sitä koskevat algoritmit voidaan yleistää binääripuun käsittelyalgoritmeista. 13.10.2015 Tietorakenteet ja algoritmit 29

7.4.1 räitä läpikäynnin sovelluksia: sijärjestys sisällysluettelon tulostaminen tiedostoluettelon tulostaminen Sisäjärjestys hakupuun sisältö aakkostettuna lauseke infix-muodossa Jälkijärjestys tulosyhteenveto lauseke postfix-muodossa 13.10.2015 Tietorakenteet ja algoritmit 30

7.4.2 Läpikäyntijärjestyksen merkityksiä sijärjestys vastaa depth first-hakua etsitään tietty haara mahdollisimman pitkälle ennen kuin peräännytään Tasojärjestys vastaa breadth first hakua etsitään tietyllä etäisyydellä juuresta olevia solmuja. Näihin palataan verkkoalgoritmien yhteydessä kurssin lopussa. 13.10.2015 Tietorakenteet ja algoritmit 31

7.5 Puiden sovelluksia 7.5.1 Jäsennyspuu. simerkiksi lauseke voidaan esittää puurakenteen avulla lkuperäinen infix-lauseke: 5 * ( ( 9 + 8 ) * (4 + 6) + 7 ) Kun tämä puu käydään läpi jälkijärjestyksessä, saadaan lauseke postfix-muodossa : 5 9 8 + 4 6 + * 7 + * + 13.10.2015 Tietorakenteet ja algoritmit 32

Sisäjärjestys antaa lausekkeen alkuperäisessä infixmuodossa, kunhan sulut lisätään yhteenlaskusolmujen oikeille puolille 5 * ( ( 9 + 8 ) * ( 4 + 6 ) + 7 ) sijärjestys antaa ns. prefix-muodon * 5 + * + 9 8 + 4 6 7 13.10.2015 Tietorakenteet ja algoritmit 33

Jäsennyspuun luominen: 1. Luetaan postfix-lauseketta merkki kerrallaan 5 9 8 + 4 6 + * 7 + * 2. Operandi => Tehdään tästä uuden puun juuri Osoitin uuteen puuhun asetetaan pinoon 3. Operaattori => Tehdään tästä uuden puun juuri Oikeaksi lapseksi popataan pinon päällimmäinen Vasemmaksi lapseksi seuraava Osoitin uuteen puuhun pinoon 13.10.2015 Tietorakenteet ja algoritmit 34

sim: 5 9 K4.10a 5 5 9 8 + 5 9 8 5 + 9 8 13.10.2015 Tietorakenteet ja algoritmit 35

4 6 5 4 5 4 6 + + 9 8 9 8 + * 5 5 * + + + + 9 8 4 6 9 8 4 6 13.10.2015 Tietorakenteet ja algoritmit 36

7 + 5 7 5 + * * 7 + + + + 9 8 4 6 9 8 4 6 13.10.2015 Tietorakenteet ja algoritmit 37

* * 5 + * 7 + + 9 8 4 6 13.10.2015 Tietorakenteet ja algoritmit 38

Puista lisää ensi kerralla: 7.5.2 Binäärinen hakupuu Tieto voidaan järjestää puuhun siten, että haku on nopeaa. simerkki: binäärinen hakupuu (binary search tree) K S C G R U J T X I 13.10.2015 Tietorakenteet ja algoritmit 39

7.5.3 Keko Tieto voidaan järjestää puuhun siten, että suurimman (pienimmän) alkion etsiminen on nopeaa. Keko on tärkeä prioriteettijono (itseopiskeluasiaa) Toteutus kuitenkin taulukkona! X T O G S M N R I 13.10.2015 Tietorakenteet ja algoritmit 40