5. Puut. Kuva 5.1. Sukupuu Puun abstrakti tietotyyppi

Koko: px
Aloita esitys sivulta:

Download "5. Puut. Kuva 5.1. Sukupuu Puun abstrakti tietotyyppi"

Transkriptio

1 5. Puut Aabraham Seuraavaksi käsitellään yhtä tärkeimmistä tietojenkäsittelytieteen ei-lineaarisista käsitteistä, puuta (tree). Puut ovat olleet keksintönä todellinen läpimurto, koska niissä luotiin tehokas eilineaari tapa järjestää nopeasti tietoa lineaarisiin tietorakenteisiin verrattuna. Jaakob Iisak Eesau Ismael Järjestyssuhteet ovat puissa monipuolisemmat kuin pelkät edeltäjä ja seuraaja -relaatiot lineaaristen tietorakenteiden yhteydessä. Puussa suhde on hierarkkinen (hierarchical), jolloin jotkut oliot ovat toisten yläpuolella ja toiset alapuolellla. Tällöin käytetään yleensä nimikkeitä vanhempi, lapsi, esi-isä ja jälkeläinen. Nimikkeiden metafoora voisi tulla kenties sukupuista, kuten kuvassa 5.1. Ruuben Simeon Leevi Kuva 5.1. Sukupuu. 5. kappale kappale 158 Kännykkä Oyj 5.1. Puun abstrakti tietotyyppi T & K myynti osto tuotanto Puu on abstrakti tietotyyppi, joka tallettaa alkiot hierarkkisesti. Päällimmäistä alkiota lukuunottamatta jokaisella alkiolla, solmulla (node), on vanhempi tai isä (parent, father) ja mahdollisesti lapsia (children). Toisinaan käytetään myös termejä edeltäjä ja seuraaja. Päällimmäistä solmua sanotaan juureksi (root), ja puu esitetään ylösalaisin (helpompi piirtää kasvusuunta alaspäin) kuvan 5.2. tavoin. kotimaa ulkomaat pohjoismaat muu Eurooppa muut maanosat laitteisto Afrikka Amerikat Aasia Australia ohjelmisto Kuva 5.2. Kuvitteellisen yrityksen organisaatiokaavio puuna. Juurena on itse yritys. Sen lisäksi sisäsolmuina ovat myynti, tuotanto, ulkomaat ja muut maanosat. Ulkosolmuina eli lehtinä ovat muut solmut. 5. kappale kappale 160

2 Nimikkeitä ja perusominaisuuksia Puulla T on juurisolmu r, jolla ei ole vanhempaa. Jokaisella puun T muulla solmulla v on vanhempisolmu u. Juuri r on puun T jokaisen solmun v esivanhempi tai -isä (ancestor). Esivanhemman täsmällinen määritelmä on esitettävissä rekursion avulla. Solmun esivanhempi on nimittäin joko solmu itse tai solmun vanhemman esivanhempi. Voidaan ilmaista kääntäen, että solmu v on solmun u jälkeläinen (descendant), jos u on solmun v esivanhempi. Esim Java-ohjelman luokkienvälinen periytyminen muodostaa puun. Luokka java.lang on kaikkien muiden esivanhempi. Jos solmu u on solmun v vanhempi, niin v on solmun u lapsi (child). Vanhemman lapset ovat sisaruksia (siblings). Solmu on ulkosolmu (external node) eli lehti (leaf), jos sillä ei ole lapsia, muuten se on sisäsolmu (internal node). Puun alipuu (subtree) solmussa v käsittää v:n lisäksi kaikki tämän jälkeläiset puussa. Esim Tiedostot järjestetään useimmissa käyttöjärjestelmissä hierarkkisesti sisäkkäisiksi hakemistoiksi, jotka esitetään puuna (kuva 5.3.). Hakemistot muodostavat puun sisäsolmut ja tiedostot lehdet. Unix-käyttöjärjestelmässä puun juurta kutsutaan juurihakemistoksi (merk. symbolilla /). Se on tiedostojärjestelmän kaikkien hakemistojen esivanhempi. 5. kappale kappale 162 tietorakenteet /user/rt/kurssit neurolaskenta Puu on järjestetty (ordered), jos lasten välillä on määritelty lineaarinen järjestys, jolloin solmun lapset voidaan tunnistaa ensimmäisenä, toisena jne. Järjestystapa riippuu käyttötarkoituksesta. Tavallisesti se esitetään piirtämällä sisarussolmut vasemmalta oikealle. l1 luennot... l26 Puu T on solmujen joukko, joka tallettaa alkiot vanhempi-lapsisuhteessa: viikkoharjoitukset vh1... vh13 harjoitustyö Kuva 5.3. Tämä on tiedostojärjestelmän osa, jossa tietorakenteet-kurssin alipuu sisältää 43 solmua. Esim Rakenteinen dokumentti, kuten kirja, voidaan järjestää hierarkkisesti puuna, jonka sisäsolmut ovat lukuja ja alilukuja ja jonka ulkosolmut eli lehdet ovat tekstikappaleita, taulukoita, kuvia, bibliografia jne. Juuri vastaa itse kirjaa. Tekstikappaleet voitaisiin vielä jakaa virkkeisiin, lauseisiin ja sanoihin, jotka sisältävät merkkejä. Puu on tässä esimerkki järjestetystä, sillä solmujen lapsien välillä on hyvin määritelty järjestys (kuva 5.4.). 5. kappale kappale 164

3 kirja esipuhe osa A osa B viitteet kpl kpl 1. luku 5. luku 6. luku 9. luku kpl kpl 1.1 luku 1.4 luku 5.1 luku 5.7 luku 6.1 luku 6.5 luku 9.1 luku 9.6 luku Binääripuu (binary tree) on järjestetty puu, jossa solmuilla on joko ei yhtään tai kaksi lasta. Tämä määritellään toisinaan aidoksi (strict) binääripuuksi, jolloin voidaan sanoa binääripuun solmun käsittävän ei yhtään, yhden tai kaksi lasta. Tässä esityksessä pitäydytään ensimmäiseen määritelmään ja jälkimmäinen, ei-aito tapaus, mielletään yleisen puun erääksi tapaukseksi. Tällöin binääripuun solmun ensimmäinen lapsi on vasen (left) ja toinen oikea (right). Solmun vasemman ja oikean lapsen mukaan nimetään ne juurinaan vasen ja oikea alipuu (subtree). kpl kpl kpl kpl Binääripuilla on lukuisia sovelluksia. Kaksi kuvataan suppeasti seuraavissa esimerkeissä. Kuva 5.4. Kirjan rakenne esitetty puuna. 5. kappale kappale 166 kuulovaurio? kyllä ei Esim Binääripuut ovat tärkeitä yhteyksissä, joissa halutaan esittää erilaisia tuloksia riippuen joidenkin testien tuloksista, joihin vastataan kyllä tai ei tai ylipäänsä jollakin binäärivastauksella (kaksiarvoisella muuttujalla). Kysymys on päätöspuista (decision trees). Näissä lehtisolmu v edustaa päätöstä, johon päädytään tilanteessa, että vastaukset esitettyihin kysymyksiin ovat puun kyseisen haaran mukaiset, ts. johtavat solmuun v. Kuvassa 5.5. on eräs esimerkki yksinkertaisesta päätöspuusta huimauspotilaiden korvalääketieteellisessä tasapainotutkimuksessa. ei hyvänlaatuista asentohuimausta huimauskohtausten esiintymismäärä? 1 > 1 ei hyvänlaatuista asentohuimausta ei hyvänlaatuinen asentohuimaus päävamma? kyllä ei hyvänlaatuista asentohuimausta Kuva 5.5. Binääri päätöspuu tutkittaessa huimauspotilaalta hyvänlaatuisen asentohuimauksen mahdollisuutta diagnoosina. 5. kappale kappale 168

4 Esim Aritmeettinen lauseke on esitettävissä puuna, jonka lehdet sisältävät muuttujat ja vakiot ja sisäsolmut sisältävät operaattoreita +, -, ja / (kuva 5.6.). Puun jokaisella solmulla on arvonaan jokin lausekkeen symboli. Jos solmu on lehti, sen arvo on muuttuja tai vakio. Jos se on sisäsolmu, sen arvo on lapsiin liittyvä operaatio. Tällainen aritmeettinen lauseke kuvataan binääripuuna, koska kullakin operaattorilla on täsmälleen kaksi operandia. Lisäksi pitää huomata operandeilla olevan määrätty järjestys, joka vaikuttaa tulokseen (paitsi operaattoreilla + ja ). Kääntäjän kääntäessä korkeantason kieltä väli- tai konekieleksi prosessin aikana aritmeettiset lausekkeet kuvataan abstraktilla tasolla puina, joista kuvan 5.6. tapaus voisi olla rajoitettu tapaus. / Kuva 5.6. Tämä on aritmeettista lauseketta esittävä binääripuu. Lauseke on (((3 + 1) 3) / (9 5) + 2)) ((3 (7 4)) + 6)) kappale kappale 170 Puun metodit Puun abstrakti tietotyyppi tallettaa alkiot paikkoihin, jotka sekvenssin tapaan määritellään suhteessa naapuripaikkoihin. Puun paikat (position) ovat solmuja. Naapuripaikat toteuttavat vanhempi-lapsi-suhteen, joka määrittelee kelvollisen puun. Näin ollen paikka puussa tarkoittaa solmua siinä. Puussa ovat seuraavat metodit merkittäviä: element(): Palauttaa alkion kyseisestä solmusta. Tulos: alkio container(): Palauttaa viittauksen puuhun, joka sisältää kyseisen solmun. Tulos: puu 5. kappale 171 Puun todellinen voima syntyy metodeista, jotka käyttävät solmuja: root(): Palauttaa puun T juurisolmun. Puun ollessa tyhjä esiintyy virhe. Tulos: solmu parent(v): Palauttaa solmun v vanhemman. Solmun v ollessa juuri esiintyy virhe. Syöte: solmu Tulos: solmu children(v): Palauttaa luettelon solmun v lapsista. Syöte: solmu Tulos: luettelo solmuista Jos puu T on järjestetty, lapsien luettelo antaa ne järjestyksessä. Jos solmu v on lehti, luettelo on tyhjä. 5. kappale 172

5 Edellisten lisäksi myös seuraavat ovat monesti tarpeen: isinternal(v): Testaa, onko solmu v sisäsolmu. Syöte: solmu Tulos: totuusarvo isexternal(v): Testaa, onko solmu v ulkosolmu eli lehti. Syöte: solmu Tulos: totuusarvo isroot(v): Testaa, onko solmu v juuri. Syöte: solmu Tulos: totuusarvo Nämä metodit ovat käteviä erilaisissa testeissä, jotka toteutetaan if-lauseissa ja while-silmukoissa. Oheiset yleisluontoiset metodit, jotka eivät sinänsä riipu puusta tietorakenteena, ovat hyödyllisiä puiden yhteydessä: size(): Palauttaa puun T solmujen lukumäärän. Tulos: kokonaisluku isempty(): Testaa, onko puussa T solmuja vai ei. Tulos: totuusarvo elements(): Palauttaa puun T solmuihin talletetut kaikki alkiot luettelona. Tulos: alkioiden luettelo positions(): Palauttaa puun T kaikkien solmujen (paikkojen) luettelon. Tulos: solmujen luettelo 5. kappale kappale 174 Puun rajapinta Javalla swap(v,w): Vaihtaa puun T solmujen v ja w alkiot keskenään. Syöte: kaksi solmua replace(v,e): Korvaa solmun v alkion alkiolla e ja palauttaa aiemman alkion. Syöte: solmu ja alkio Tulos: alkio Mitään erityisiä puun päivitysmetodeja ei tässä määritellä, vaan palataan niihin myöhemmin, lähinnä esimerkkien yhteydessä. Tarkastellaan kuitenkin seuraavaksi, miten em. metodit voidaan toteuttaa rajapintana Javalla. Puun geneeriset metodit on mainittu koodin 5.1. yhteydessä, ja koodin 5.2. rajapinta laajentaa edellistä. Kyseessä voivat olla mielivaltaisesti valitut oliot, ja SimpleTree perustuu paikan (solmun) abstraktioon. public interface PositionalContainer { // query methods public int size(); // return the size of the container public boolean isempty(); // return whether the container is // empty or not public Enumeration elements(); // return the elements in the // container Koodi 5.1. PositionalContainer-rajapinta. 5. kappale kappale 176

6 public Enumeration positions(); // return the positions in the // container // update methods public void swap(position v, Position w); // swap elements at v // and w public Object replace(position v, Object e); // replace with e and return the element at v Koodi 5.1. (jatkoa) PositionalContainer-rajapinta. public interface SimpleTree extends PositionalContainer { // accessor methods public Position root(); // return the root of the tree public Position parent(position v); // return the parent of v public Enumeration children(position v); // return the children of v // query methods public boolean isinternal(position v); // test whether v is internal public boolean isexternal(position v); // test whether v is // external public boolean isroot(position v); // test whether v is the root of // the tree Koodi 5.2. SimpleTree-rajapinta 5. kappale kappale Puiden perusalgoritmeja Kuvataan puunkäsittelyalgoritmeja, jotka suorittavat tehtävänsä päästen puuhun käsiksi koodin 5.2. rajapinnalla. Seuravat ajoaikaoletukset tehdään metodeille, jotka toteuttavat rajapinnan, olivatpa ne sitten mistä tahansa luokasta. Geneeriset metodit size(), isempty(), swap(v,w) ja replace(v,e) toimivat ajassa. Metodit root() ja parent(v) toimivat ajassa. Boolen-tyyppiset metodit isinternal(v), isexternal(v) ja isroot(v) toimivat myös ajassa. Metodit elements() ja positions() toimivat ajassa O(n), jossa n on puun solmujen lukumäärä. 5. kappale 179 Metodi children(v) toimii ajassa O(c v ), jossa c v on solmun v lasten lukumäärä. Metodien elements() ja children(v) tuloksille metodit hasmoreelements() ja nextelement() toimivat ajassa. Myöhemmin, luvussa 5.4. esitetään tietorakennetoteutukset, jotka täyttävät nämä suoritusaikaoletukset. Sitä ennen käsitellään vielä muutamia perusasioita ja kuinka näitä metodeja sovelletaan puuongelmien ratkaisemisessa. Syvyys ja korkeus Olkoon v puun T solmu. Solmun v syvyys (depth) on sen esivanhempien lukumäärä poislukien solmu itse. Esim. kuvan 5.2. solmun ulkomaat syvyys on 2. Täten juuren syvyys on 0. Solmun syvyys on määriteltävissä rekursiivisesti: 5. kappale 180

7 Jos v on juuri, sen syvyys on 0. Muuten solmun v syvyys on yksi lisättynä solmun v vanhemman syvyydellä. Määritelmän mukaisesti koodin 5.3. algoritmi laskee solmun v syvyyden puussa T. Algoritmin suoritusaika on O(d v ), missä d v viittaa solmun v syvyyteen, sillä algoritmi suorittaa vakioaikaisen rekursiivisen askeleen jokaiselle solmun v esivanhemmalle. Huomaa, että tämän osan (5.2.) Java-esimerkit voivat olla hieman epäyhtenäisiä, joten nämä on syytä lukea ikään kuin pseudokoodina. public int depth (SimpleTree T, position v) { if (T.isRoot(v)) return(0); else return(1+depth(t.parent(v))); Koodi 5.3. Metodi depth solmun syvyyden tutkimista varten. 5. kappale kappale 182 Solmun v korkeus (height) puussa T määritellään niin ikään rekursiivisesti: Jos v on ulkosolmu eli lehti, sen korkeus on 0. Muuten solmun v korkeus on yksi lisättynä solmun v lapsen maksimikorkeudella. public int height1 (SimpleTree T) { // computation of the height of a tree by taking the maximum of the // depths of its external nodes int h = 0; Enumeration nodes_of_t = T.positions(); Koko puun korkeus on sama kuin juuren korkeus. Esim. kuvan 5.2. puun korkeus on 4. Puun korkeuden voi mieltää myös sen maksimisyvyytenä jostakin solmusta, joka on sen lehti. Seuraavassa on algortmi korkeuden laskemista varten. Koodi 5.4. (alkuosa) Metodi height1 solmun korkeuden laskemista varten. 5. kappale kappale 184

8 while (nodes_of_t.hasmoreelements()) { Position v = (Position) nodes_of_t.nextelement(); if (T.isExternal(v)) h = Math.max(h,depth(T,v)); return h; Koodi 5.4. (loppuosa) Metodi height1 solmun korkeuden laskemista varten. Mukana on tyypinmuunnos geneerisestä oliosta Position-olioon sekä metodin max käyttämistä. Koodin 5.4. metodi height1 on hyvin yksinkertainen toimintaidealtaan. Se käy läpi kaikki solmut, laskee lehtien korkeudet koodin 5.3. metodin depth avulla ja lopuksi antaa suurimman korkeuden. Algoritmi height1 on melko tehoton. Olkoon d v jälleen solmun v syvyys. Koska d v h + 1 n, missä h on puun T korkeus ja n solmujen määrä, voidaan todeta algoritmin depth(v) pahimman tapauksen kompleksisuuden olevan O(h), joka on O(n). Tästä seuraa, että height1 toimii ajassa O(Σ v T d v ), joka on O(nh) eli O(n 2 ) pahimmassa tapauksessa. 5. kappale kappale 186 Seuraava lause on monesti hyödyllinen, ja se osoittaa em. puun rekursiivisen korkeuden laskemisen olevan lineaarinen aikakompleksisuudeltaan. Korkeuden laskeminen voidaan tehdä edellistä tehokkaammin ajassa O(n), kun lasketaan rekursiivisesti puun ja sitten sen lasten alipuiden korkeus. Tästä tulee luokkaa O(c v ) olevaa laskentaa, missä c v on solmun v lasten lukumäärä. Kun kukin iteraatio vaatii aikaa, niin jokaiselle solmulle tarvitaan siis aikaa O(c v ), ja kaikkiaan sitä vaaditaan O( c v v T ). Lause 5.1. Olkoon T puu, jossa on n solmua, ja olkoon c v puun T solmun v lasten lukumäärä. Silloin on c v v T = n 1. Perustelu: Lukuunottamatta juurta puun T jokainen solmu on jonkin toisen solmun lapsi, mikä aikaansaa mainitun sarjan summan. 5. kappale kappale 188

9 Puun kulkeminen esijärjestyksessä Puun T kulkeminen (traversal) merkitsee järjestelmällistä tapaa vuorotellen käydä solmuissa eli saada kukin solmu. Kuljettaessa puuta esijärjestyksessä (preorder) käydään ensin juuressa ja sitten tämän alipuissa käymällä lapset rekursiivisesti läpi. Mitä toiminta käynti solmussa merkitsee kulloinkin, riippuu sovelluksesta. Esijärjestys-algoritmin pseudokoodi on kuvattu koodissa 5.5., jossa sitä aluksi kutsutaan käskyllä preorder(t,t.root()). Algorithm preorder(t,v): käy solmussa v for solmun v jokaiselle lapselle w do käy rekursiivisesti alipuu juureltaan w kutsuen sitä käskyllä preorder(t,w) Koodi 5.5. Esijärjestys-algoritmi. Puun kulkeminen esijärjestyksessä on hyödyllinen haluttaessa solmut lineaarisessa järjestyksessä, jossa vanhemmat tulevat ennen järjestyksessä käytäviä lapsiaan. 5. kappale kappale 190 otsikko abstrakti johdanto julkaisu 2. menetelmät 3. tulokset viitteet Kuva 5.7. Puun käynti esijärjestyksessä, jossa jokaisen solmun lapset ovat järjestettyinä vasemmalta oikealle. Esim Dokumenttiin liittyvä, kuten esim. 5.3., puun esijärjestyksessä kulkeminen tuottaa perättäisesti koko dokumentin. Puun kulkeminen esijärjestyksessä on tehokas toiminto. Olkoon puussa T solmuja n, ja oletetaan käynnin solmussa vievän aikaa. Tällöin analyysi muistuttaa edellä mainittua tehokasta puun korkeuden laskentaa, joka toimi lineaarisessa ajassa. Esijärjestys-algorimin ei-rekursiivinen osa vaatii jokaisessa solmussa v aikaa O(c v ), missä c v on solmun v lasten lukumäärä. Lauseen 5.1. mukaan esijärjestys-algoritmin suoritusajaksi tulee O(n). Koodin 5.6. algoritmi kulkee rekursiivisesti puun esijärjestyksessä ja tulostaa kunkin solmun alkion. 5. kappale kappale 192

10 public void preorderprint (SimpleTree T, Position v) { // Preorder traversal of the subtree rooted at node v that prints to // the standard output the elements stored at the nodes in the // order they are visited. It assumes that the elements support // tostring(). System.out.println(T.element(v)); Enumeration children_of_v = T.children(v); while (children_of_v.hasmoreelements()) { Position w = (Position) children_of_v.nextelement(); preorderprint(t,w); // recursive call Koodi 5.6. Algoritmi preorderprint. Puun kulkeminen esijärjestyksessä on hyödyllistä, kun pitää ratkaista puuongelma, jossa on suoritettava laskentaa solmulle ennen tämän jälkeläisiä. Puun kulkeminen jälkijärjestyksessä Toinen tärkeä puussakulkemisalgoritmi on jälkijärjestys tai loppujärjestys (postorder). Tämä voidaan ymmärtää esijärjestyksen vastakohtana, sillä se käy rekursiivisesti läpi aluksi juuren lasten muodostamat alipuut ja sitten juuren (koodi 5.7). Jos puu on järjestetty, solmun lasten käsittelyn rekursiiviset kutsut tehdään ko. järjestyksen mukaisesti. 5. kappale kappale 194 Algorithm postorder(t,v): for solmun v jokaiselle lapselle w do käy rekursiivisesti solmu w juurena alipuu kutsumalla algoritmia postorder(t,w) käy solmussa v otsikko abstrakti 1. johdanto julkaisu 2. menetelmät 3. tulokset viitteet Koodi 5.7. Jälkijärjestys-algoritmi Menetelmän nimi tulee käyntijärjestyksestä, jossa ensin käydään solmun lapsissa ennen itse solmua (kuva 5.8.). Menetelmän analyysi on samankaltainen kuin esijärjestyksellä. Se on O(n), kun yhdessä solmussa käynti vaatii vakioajan. Kuva 5.8. Puun kuvasta 5.7. käynti jälkijärjestyksessä. 5. kappale kappale 196

11 Jälkijärjestyksessä kulkemisesta on esimerkkinä rekursiivinen metodi postorderprint koodina 5.8., jossa solmu tulostetaan siinä käytäessä. public void postorderprint (simpletree T, Position v) { // Postorder traversal of the subtree rooted at node v that prints to // the standard output the elements stored at the nodes in the // order they are visited. Enumeration children_of_v = T.children(v); while (children_of_v.hasmoreelements()) { Position w = (Position) children_of_v.nextelement(); postorderprint(t,w); // recursive call System.out.println(v.element()); // Assumes elements implement // tostring() Koodi 5.8. Algoritmi postorderprint. 5. kappale 197 Jälkijärjestyksessä puun kulkeminen on hyödyllistä ratkaistaessa ongelmia, joissa halutaan laskea solmun jokin ominaisuus, mutta tämä edellyttää, että aiemmin on laskettu solmun lasten vastaava ominaisuus. Luonnollisesti muitakin puiden kulkemisjärjestyksiä on olemassa, kuten myöhemmin binääripuiden yhteydessä esitettävä välijärjestys, mutta esi- ja jälkijärjestykset ovat yksinkertaisia ja usein hyödyllisiä menetelmiä. 5. kappale Binääripuut Erityisen merkittävä puulaji on binääripuut (binary trees). Binääripuu on järjestetty, jossa jokaisella sisäsolmulla on kaksi lasta. Kuten edellä mainittiin, tässä noudatetaan määritelmää, että binääripuu on aito, ts. siinä ei ole solmuja, joilla olisi vain yksi lapsi. Tämä menettelytapa ei kuitenkaan aiheuta mitään hankaluutta yleisyyden kannalta, sillä epäsopivat puut ovat muunnettavissa määritelmän mukaisiksi binääripuiksi. Binääripuilla on paljon sovelluksia, joista nähtiin edellä esim päätöspuista ja esim aritmeettisen lausekkeen esityksestä. Binääripuiden ominaisuuksia Binääripuilla on useita mielenkiintoisia ominaisuuksia, kuten seuraava. Lause 5.2. Lehtien lukumäärä binääripuussa T on yksi enemmän kuin sisäsolmujen määrä. Perustelu: Tämä osoitetaan jakamalla solmut lehti- ja sisäsolmuihin. Yksinkertaisimmillaan, kun T käsittää vain juuren, siinä on pelkästään yksi lehti, jolloin lause on tosi. Muussa tapauksessa poistetaan puusta T (mielivaltaisesti valittu) lehti v ja sen vanhempi u, joka on sisäsolmu. Näin poistetaan kerrallaan yksi solmu kumpaakin tyyppiä. Jos solmulla u oli vanhempi w, yhdistetään w solmun v entiseen sisarukseen kuvan 5.9. tapaan. 5. kappale kappale 200

12 w u w z v z z w Kyseinen operaatio removeaboveexternal(v) poistaa yhden sisäsolmun ja yhden lehden eli ulkosolmun, mutta puu pysyy edelleen binäärisenä. Toistaen operaatiota päästään lopulta yksittäisen lehden tilanteeseen. Täten on osoitettu, että lehtiä on yksi enemmän kuin sisäsolmuja. (a) Kuva 5.9. Operaatio removeaboveexternal(v) poistaa lehden ja sisäsolmun. (b) (c) Puun T kaikkien samalla syvyydellä d olevien solmujen joukkoa kutsutaan tasoksi (level). Tasolla 0 on juuri, tasolla 1 on enintään kaksi solmua (juuren lapset), tasolla 2 on enintään neljä solmua jne. Yleisesti tasolla d on enintään 2 d solmua (kuva 5.10.). 5. kappale kappale 202 taso solmuja Oheiset ominaisuudet ovat johdettavissa kuvan havainnollistamana koskien binääripuun korkeutta ja solmujen määrää. Lause 5.3. Olkoon T binääripuu, jossa on n solmua ja h puun korkeus. Silloin puulla T on seuraavat ominaisuudet: 1. Puun T lehtien määrä on vähintään h+1 ja enintään 2 h. 2. Puun T sisäsolmujen määrä on vähintään h ja enintään 2 h Puun T solmujen kokonaismäärä on vähintään 2h+1 ja enintään 2 h Puun T korkeus on vähintään log(n+1)-1 ja enintään (n-1)/2 eli log(n+1)-1 h (n-1)/2. Kuva Maksimimäärät solmuja binääripuun tasoilla. Jääkööt näiden perustelut lukijan pohdittaviksi. 5. kappale kappale 204

13 Lauseen 5.3. tärkeä seuraus on se, että n-solmuisen binääripuun minimikorkeus on Θ(log n), jolla on huomattavaa merkitystä puita hyödyntävien algoritmien kompleksisuuksille, kuten myöhemmin nähdään. Binääripuun Java-kielinen rajapinta Binääripuun abstrakti tietotyyppi käsittää yleisen puun metodien lisäksi erityisesti seuraavat (paikka tarkoittaa tässä solmua): leftchild(v): Palauttaa solmun v vasemman lapsen. Virhe esiintyy, mikäli v on lehti. Syöte: paikka Tulos: paikka rightchild(v): Palauttaa solmun v oikean lapsen. Virhe esiintyy, mikäli v on lehti. Syöte: paikka Tulos: paikka sibling(v): Palauttaa solmun v sisaruksen. Virhe esiintyy, mikäli v on juuri. Syöte: paikka Tulos: paikka Niin ikään sisällytetään lisäysmetodi: expandexternal(v): Muuttaa lehden v sisäsolmuksi luomalla kaksi uutta lehteä ja asettamalla nämä solmun v lapsiksi. Virhe esiintyy, mikäli v on sisäsolmu. Syöte: paikka 5. kappale kappale 206 Myös poistometodi on tarpeen: removeaboveexternal(v): Poistaa lehden v ja tämän vanhemman u sekä sijoittaa v:n sisaruksen u:n paikalle (kuva 5.9.). Operaatio palauttaa solmun u. Virhe esiintyy, mikäli v on sisäsolmu. Syöte: paikka Tulos: alkio Oletetaan käytettävissä olevan binääripuukonstruktori, joka palauttaa yksittäisen lehden ilman alkiota mukanaan. Tästä solmusta lähtien voidaan muodostaa binääripuita metodilla expandexternal. Vastaavasti binääripuita voidaan karsia metodia removeaboveexternal käyttäen ja lopulta päätyä yksittäiseen solmuun. Muuntyyppisiä hyödyllisiä binääripuumetodeja käsitellään 7. luvusssa. 5. kappale 207 Mallinnetaan binääripuuta abstraktina tietotyyppinä koodin 5.9. Java-rajapinnalla, joka laajentaa edeltävää SimpleTreerajapintaa. Tältä yliluokaltaan se perii metodit. Kun binääripuut ovat järjestettyjä solmun vasen lapsi on järjestyksessä ennen oikeaa. public interface BinaryTree extends SimpleTree { // Simplified interface for a binary tree whose nodes (positions) // store arbitrary elements. // Accessor methods: public Position leftchild(position v); public Position rightchild(position v); public Position sibling(position v); Koodi 5.9. (alku) Rajapinta BinaryTree, joka laajentaa rajapintaa SimpleTree. 5. kappale 208

14 // Update methods: public void expandexternal(position v); public Object removeaboveexternal(position v); Koodi 5.9. (loppu) Rajapinta BinaryTree. Seuraavat oletukset ovat tehtävissä rajapinnan BinaryTree toteuttavan luokan metodeista. Kaikki rajapinnan SimpleTree yhteydessä esitetyt aikakompleksisuudet pysyvät sellaisenaan. Metodi children(v) toimii binääripuille ajassa, koska jokaisella solmulla on joko ei yhtään tai kaksi lasta. Metodit leftchild(v) ja rightchild(v) toimivat ajassa. Metodit expandexternal(v) ja removeaboveexternal(v) toimivat ajassa. Binääripuussa kulkeminen Puiden soveltaminen merkitsee hyvin usein niiden läpikäyntiä. Seuraavaksi tarkastellaan mainittua asiaa hyödyntäen annettua rajapintaa BinaryTree. Binääripuun kulkeminen esijärjestyksessä Mikä tahansa binääripuu voidaan mieltää myös yleisenä puuna, joten yleisen puun esijärjestys toimii yhtä hyvin binääripuulle. Tällöin sitä (koodi 5.10.) voidaan jopa yksinkertaistaa, sillä binääripuu on rajoitetumpi kuin yleinen muoto. Jälleen puun kulkemisella esijärjestyksessä on lukuisia sovelluksia. Esimerkkinä voidaan kloonata, kopioida, binääripuu T samanlaiseksi puuksi T aloittaen yhden lehden käsittävästä puusta T ja käyden puuta T rekursiivisesti läpi (koodi 5.11.). 5. kappale kappale 210 Algorithm binarypreorder(t,v): käy solmussa v (ja tee siellä tarvittava laskenta) if v on sisäsolmu then binarypreorder(t,t.leftchild(v)) {käy rekursiivisesti vasemmassa alipuussa binarypreorder(t,t.rightchild(v)) {käy rekursiivisesti oikeassa alipuussa Koodi Algoritmi binarypreorder. Kun solmussa käyminen vaatii ajan, binääripuun kopioiminen tarvitsee vain ajan O(n). Algorithm clone(t,t,v,v ): Input: Binääripuu T, joka sisältää solmun v, ja binääripuu T, joka sisältää lehtisolmun v. Output: Lisätty binääripuu T niin, että v on alipuun juurena ja alipuu on kopio puusta T, jonka juurena v on. if v on sisäsolmu then expandexternal(v ) v.element v.element() clone(t,t,t.leftchild(v),t.leftchild(v )) clone(t,t,t.rightchild(v),t.rightchild(v )) Koodi Algoritmi clone. 5. kappale kappale 212

15 Binääripuun kulkeminen jälkijärjestyksessä Jälkijärjestys toimii binääripuilla samantapaisesti kuin edellä. Algoritmi on annettu koodina Algorithm binarypostorder(t,v): if v on sisäsolmu then binarypostorder(t,t.leftchild(v)) binarypostorder(t,t.rightchild(v)) käy solmussa v (ja tee siellä tarvittava laskenta) Koodi Algoritmi binarypostorder. Jälkijärjestyskäsittely sopii hyvin mm. aritmeettisten binääristen operaatioiden evaluointiin ja muihin alhaalta-ylös- (bottom-up) eli kokoaviin evaluaatio-ongelmiin. Binääripuun käsittely jälkijärjestyksessä on tehtävissä ajassa O(n). Binääripuun kulkeminen välijärjestyksessä Binääripuut voidaan kulkea kolmannellakin tavalla, välijärjestyksessä (inorder). Tällöin solmussa käydään vasemman ja oikean alipuun rekursiivisten kutsujen välissä (koodi 5.13.). 5. kappale kappale 214 Algorithm inorder(t,v): if v on sisäsolmu then inorder(t,t.leftchild(v)) {kulje vasen alipuu rekursiivisesti käy solmussa v (ja tee siellä tarvittava laskenta) if v on sisäsolmu then inorder(t,t.rightchild(v)) {kulje oikea alipuu rekursiivisesti / Koodi Binääripuun kulkeminen välijärjestyksessä Binääripuun T kulkeminen välijärjestyksessä on nähtävissä solmujen läpikäyntinä vasemmalta oikealle. Jokaiselle solmulle v vasta kaikkien sen vasemman alipuun solmujen käynnin jälkeen käydään v:ssä ja vasta tämän jälkeen sen oikean alipuun solmuissa (kuva 5.11) Kuva Binääripuun kulkeminen välijärjestyksessä kappale kappale 216

16 Myös välijärjestyskulkemisella on lukuisia sovelluksia. Yksi tärkeimmistä on järjestetyn sekvenssin alkioiden tallettaminen puuhun, joka määrittelee rakenteen nimeltä binäärihakupuu (binary search tree) (kuva 5.12.). Siinä jokainen solmu v tallettaa alkion e tavalla, jossa v:n vasempaan alipuuhun talletetut alkiot ovat pienempiä tai yhtä suuria kuin e ja oikeaan alipuuhun talletetut tätä suurempia. Kuljettaessa välijärjestyksessä alkiot käydään ne läpi ei-vähenevässä järjestyksessä. Binäärinen hakupuu voidaan mieltää binääriseksi päätöspuuksi, joka tukee hakua ja jossa päätös tehdään sisäsolmussa kysymykselle, onko solmun alkio joko pienempi tai yhtä suuri tai suurempi kuin haettava alkio. 5. kappale 217 Binääripuuta käytetään paikallistamaan määrätynarvoinen alkio kulkien puuta T alaspäin. Kussakin sisäsolmussa verrataan sen arvoa haettavaan alkioon (hakuavaimeen). Mikäli vastaus on pienempi, jatketaan hakua vasemmassa alipuussa. Jos vastaus on yhtä suuri, alkio on löydetty. Mikäli se on suurempi, jatketaan hakua oikeassa alipuussa. Jos törmätään lehteen alkiota löytämättä, haku päättyy. Tärkeä havainto on, että haun suoritusaika on suhteessa puun T korkeuteen. Kuva esittää esimerkin binäärihausta, mutta tätä tarkempi käsittely annetaan myöhemin, luvussa 7.3. Puiden kulkemisalgoritmien tehokkuus perustuu rekursiivisyyteen. Rekursion käyttö ei kuitenkaan ole välttämätöntä, vaan voidaan käyttää (eksplisiittistä) pinoa, johon talletetaan myöhemmin tarvittavia esivanhempisolmuja matkan varrelta näihin myöhemmin palaamista varten. Tämä ei-rekursiivinenkin käsittely voidaan suorittaa lineaarisessa ajassa ja samalla säästää hieman tarvittavaa muistitilaa, jota rekursiokutsujen hallinta vaatii ohjelmointiympäristöltä. 5. kappale 218 Binääripuun Eulerin matkan kulkeminen Edellä esitetyissä puunkulkemismenetelmissä käytiin kussakin solmussa tarkalleen vain kerran. Nämä menetelmät voidaan yhdistää yhdeksi menetelmäksi sallimalla yhtä useampi käynti solmussa puun kulkemisen aikana. Tällainen menetelmä on Eulerin matkan kulkeminen (Euler tour traversal). Siinä saadaan puun yleisen kulkemisen esitys Kuva Kokonaislukuja sisältävä binäärihakupuu. Kiinteät paksut viivat (keskellä) kuvaavat luvun 36 onnistuneen haun ja katkoviivat luvun 70 epäonnistuneen haun. 5. kappale 219 Intuitiivisesti esitettynä kysymys on binääripuun kulkemisesta ympärikävelynä, jossa lähdetään juuresta ja kuljetaan tämän vasempaan lapseen pitämällä kaaret (edge, arc) kulkusuunnasta katsoen vasemmalla puolella (kuva 5.13.). Puun T jokaisessa solmussa v käydään kolmesti: vasemmalta (ennen solmun v vasempaan alipuuhun menoa), alhaalta (solmun v vasemman ja oikean alipuun välissä) ja oikealta (solmun v oikean alipuun käynnin jälkeen). 5. kappale 220

17 Solmun v ollessa lehti kaikki kolme käyntiä tapahtuvat itse asiassa samalla kertaa. Menetelmä on esitetty algoritmina koodissa / Kuva Eulerin matka binääripuussa. 5. kappale Algorithm eulertour(t,v): käy solmussa v vasemmalta if v on sisäsolmu then käy rekursiivisesti solmun v vasemmassa alipuussa käyttäen kutsua eulertour(t,t.leftchild(v)) käy solmussa v alhaaltapäin if v on sisäsolmu then käy rekursiivisesti solmun v oikeassa alipuussa käyttäen kutsua eulertour(t,t.rightchild(v)) käy solmussa v oikealta Koodi Algoritmi eulertour. 5. kappale 222 Kulkeminen esijärjestyksessä muistuttaa Eulerin matkaa siinä mielessä, että solmuun liittyy käynti tultaessa solmuun sen vasemmalta puolelta. Vastaavasti väli- ja jälkijärjestyksille solmussa käydään tultaessa alhaaltapäin tai oikealta. Esi-, jälki- ja välijärjestys-algoritmien suoritusajat olivat O(n), kun käynti solmussa vaati vakioajan. Niin on Eulerin matkan tapauksessakin, suoritusaika O(n). Eulerin matkalla on erilaisia sovelluksia, joihin ei tässä puututa. Kuvatusta yleisluonteisesta Eulerin matkasta voidaan muodostaa myös muita kulkemismenetelmiä kuin em. kolme perusmenetelmää Puutietorakenteiden toteuttaminen Seuraavaksi tarkastellaan puiden konkreettista esittämistä tietorakenteina sekä puun ja binääripuun abstrakteja tietotyyppejä. Binääripuiden sekvenssipohjainen rakenne Binääripuun T yksinkertainen toteutus perustuu sen solmujen määrättyyn numerointiin. Olkoon p(v) kuhunkin solmuun v liitetty kokonaisluku määriteltynä seuraavasti (kuva 5.14.): Jos v on puun T juuri, niin p(v) = 1. Jos v on solmun u vasen lapsi, niin p(v) = 2p(u). Jos v on solmun u oikea lapsi, niin p(v) = 2p(u) kappale kappale 224

18 / (a) Kuva Binääripuun tasojen numerointi: (a) yleinen kaavio. Kuva (jatkoa) Binääripuun tasojen numerointi: (b) esimerkki. 5. kappale kappale 226 Funktio p antaa solmujen järjestysnumeroinnin, kun se järjestää solmut puussa tasoittain kasvavaan järjestykseen vasemmalta oikealle (joskus voidaan hypätä yli joitakin numeroita, so. tyhjät alkiot). Funktio p muodostaa binääripuun esityksen sekvenssin S avulla, jolloin T:n solmu v liitetään S:n alkion astetta p(v) (ks. kuvaa 5.15.). Tavallisesti sekvenssi tässä tapauksessa toteutetaan taulukkona, jonka käyttö on nopeaa ja yksinkertaista. Sille saadaan tehokkaat toteutukset metodeille root, parent, leftchild, rightchild, isinternal, isexternal ja isroot muutamin yksinkertaisin aritmeettisin laskutoimituksin solmujen luvuilla p. Yksityiskohtiin menemättä (harjoitustehtävä) todetaan jokaisen mainituista metodeista toimivan ajassa. S / Kuva Binääripuuesitys sekvenssin avulla. T kappale kappale 228

19 Olkoon n puun T solmujen lukumäärä ja N arvon p(v) maksimi puussa T. Kun sekvenssi on toteutettu em. tavalla, taulukon koko on vähintään n+1 ja enintään N (alkio astetta 0 ei liity mihinkään solmuun). Sekvenssi voi sisältää paljon tyhjiä alkioita, jotka eivät liity mihinkään solmuun. Pahimmassa tapauksessa on N = 2 (n+1)/2-1 (perustelu harjoitustehtävänä). Myöhemmin, luvussa 6.3., esitetään keko- eli kasarakenne, jossa on N = n+1. Tilaa hukkaavasta piirteestään huolimatta sekvenssi on tehokas rakenne binääripuiden tapauksessa, mutta ei enää monihaaraisen yleisen puun tilanteessa. Taulukossa 5.1. on yhteenveto binääripuutoteutuksen metodien suoritusajoista sekvenssiä käytettäessä. Sekvenssi on tässä tehokas, mutta korkeille puille muistitilan käyttö on tehotonta. 5. kappale 229 Taulukko 5.1. Binääripuun T metodien suoritusajat käytettäessä taulukolla toteutettua sekvenssiä. Solmujen määrä on n ja sekvenssin koko N. Metodeihin elements(), positions(), ja children(v) liittyvät hasmoreelements() ja nextelement() toimivat ajassa. Tilavaatimus on O(N), joka on O(2 (n+1)/2 ) pahimmassa tapauksessa. Metodilla removeaboveexternal(v) on yleisessä tapauksessa O(n), mutta solmun v molempien lapsien ollessa lehtiä, kuten yleensä, se on. operaatio suoritusaika size, isempty positions, elements swap, replace(v,e) root, parent, children leftchild, rightchild isinternal, isexternal, isroot expandexternal removeaboveexternal O(n) O(n), 5. kappale 230 Binääripuiden linkitetty rakenne vanhempi juuri 5 koko Linkitetty rakenne (linked structure) on luonnollinen tapa toteuttaa binääripuu T. Tällöin jokainen solmu v esitetään oliolla, jolla on viittaukset solmuun v talletettuun alkioon sekä solmun v lapsiin ja vanhempaan liittyviin olioihin (ks. kuva 5.16.). Luokka Node (koodi 5.15.) esittää solmun v olion avulla, jolla on muuttujat element, left, right ja parent. Nämä viittaavat solmuun v tallettettuun alkioon, tämän vanhempaan sekä vasempaan ja oikeaan lapseen. Luokalla Node on myös metodit, joilla muuttujat saadaan ja asetetaan. 5. kappale 231 vasen alkio oikea (a) Baltimore Chicago New York Providence Seattle (b) Kuva Binääripuutoteutus linkitettynä rakenteena: (a) solmun olio ja (b) viiden solmun binääripuu kokonaisuudessaan. 5. kappale 232

20 public class Node implements Position { // node of a binary tree realized by means of a linked structure private Container container; // container storing this node private Object element; // element stored at the node private Node left; // left child private Node right; // right child private Node parent; parent node public Node() { // default constructor Koodi (alkuosa) Solmun luokka Node. public Node(Object o, Node u, Node v, Node w, Container c) { // constructor with parameters setelement(o); setcontainer(c); setparent(u); setleft(v); setright(w); public Object element() { return element; protected void setelement(object o) { element=o; Koodi (jatkoa) Solmun luokka Node. 5. kappale kappale 234 public Container container() { return container protected void setcontainer(container c) { container=c; protected Node getleft() { return left; protected void setleft(node v) { left=v; protected Node getright() { return right protected void setright(node v) { right=v; protected Node getparent() { return parent protected void setparent(node v) { parent=v; Koodi (loppuosa) Solmun luokka Node. 5. kappale 235 Luokka LinkedBinaryTree (koodi 5.16.) tallettaa muuttujiinsa puun koon ja viittauksen olioon Node, joka liittyy puun juureen. Se toteuttaa rajapinnan BinaryTree (koodi 5.9.) metodit replace, root, parent, leftchild, rightchild, isinternal, isexternal, isroot ja expandexternal kutsuen suoraan luokan Node (koodi 5.15.) metodeja. Jokainen näistä metodeista toimii ajassa. public class LinkedBinaryTree implements BinaryTree { private Position root; // reference to the root private int size; // number of nodes public LinkedBinaryTree() { root = new Node(null,null,null,null,this); size = 1; Koodi 5.16 (alkuosa) Osa luokkaa LinkedBinaryTree, jossa on muutamien metodien toteutuksia mukana rajapinnasta BinaryTree. 5. kappale 236

21 public int size() { return size; public boolean isempty() { return (size==0); public Object replace(position v, Object o) { Object temp = ((Node) v).element(); ((Node) v).setelement(o); return temp; public Position leftchild(position v) { return ((Node) v).getleft(); public Position rightchild(position v) { return ((Node) v).getright(); public Position parent(position v) {return ((Node) v).getparent(); public boolean isinternal(position v) { return (((Node) v).getleft()!=null && ((Node) v).getright()!=null); public boolean isexternal(position v) {return (((Node) v).getleft()==null && ((Node) v).getright()==null); public boolean isroot(position v) { return (v==root()); public Position root() { return root; public void expandexternal(position v) { if (isexternal(v)) { ((Node) v).setleft(new Node(null,(Node) v,null,null,this)); ((Node) v).setright(new Node(null,(Node) v,null,null,this)); size+=2; Koodi 5.16 (jatkoa) Osa luokkaa LinkedBinaryTree, jossa on muutamien metodien toteutuksia mukana rajapinnasta Koodi 5.16 (loppuosa) Osa luokkaa LinkedBinaryTree, jossa on muutamien metodien toteutuksia mukana rajapinnasta BinaryTree. BinaryTree. 5. kappale kappale 238 Edeltä (koodi 5.16.) oli jätetty pois osa metodien toteutuksista. Nämäkin käydään läpi seuraavassa tarkastelussa. Metodit size() ja isempty() toimivat ajassa. Metodissa swap(v,w) yksinkertaisesti vaihdetaan alkioiden v ja w viittaukset keskenään. Se toimii ajassa. Myös metodi replace(v,e) on toteutettavissa toimivaksi ajassa. Käyttäen sekvenssiä ja paikkaa siinä operaatiot elements(), positions() ja children() ovat toteutettavissa. Niissä käytettävät metodit hasmoreelements() ja nextelement() toimivat ajassa. Metodi positions() voidaan toteuttaa kulkemalla binääripuu läpi (esi-, väli- tai jälkijärjestyksessä). Käytäessä solmussa v lisätään viittaus siihen sekvenssin loppuun. Metodi elements() on samankaltainen. Tällöin nämä toimivat ajassa O(n). Luokalla LinkedBinaryTree (koodi 5.16.) on ilman parametreja oleva konstruktori, joka palauttaa yhden solmun käsittävän Jokaista puun T solmua varten on olio luokasta Node (koodi 5.15.). Puuta itseään varten on olio luokasta LinkedBinaryTree (koodi 5.16.). Nämä oliot vaativat vakiomäärän tilaa. Niinpä tarvittava kokonaistila on c 1 n + c 2, missä c 1 ja c 2 ovat joitakin positiivisia vakioita, ts. O(n). Taulukossa 5.2. on yhteenveto binääripuun metodien suoritusaikavaatimuksista. Taulukko 5.2. Binääripuun (n solmua) metodien suoritusajat linkitettyä rakennetta käytettäessä. Muistitilavaatimus on O(n). operaatiot size, isempty positions, elements swap, replace root, parent, children(v,e) leftchild, rightchild isinternal, isexternal, isroot expandexternal, suoritusaika O(n) puun. 5. kappale 239 removeaboveexternal 5. kappale 240

22 vanhempi Yleisten puiden linkitetty rakenne alkio New York Linkitetyn rakenteen käyttö on mahdollista laajentaa binääripuista yleisiin puihin. Kun ei ole rajoitettu lasten määrää yleisen puun solmuissa, käytetään säiliötä (container, esim. sekvenssinä) solmun v lasten tallettamiseen muuttujien sijasta. Tätä esittää kuva Käytettäessä säiliötä lasten tallettamiseen metodi children(v) voidaan toteuttaa yksinkertaisesti käyttäen apuna metodia elements(). 5. kappale 241 lasten säiliö (a) Baltimore Chicago Providence Seattle Kuva Yleisen puun linkitetty rakenne: (a) solmuun liitetty olio ja (b) osa tietorakennetta, jossa on solmu lapsineen. (b) 5. kappale 242 Taulukko 5.3. esittää linkitetyn rakenteen toteutusten suorituskyvyn. Operaatioiden analyysi jääköön lukijalle. Taulukko 5.3. Yleisen puun (n solmua ja c v solmun v lapset) metodien suoritusajat käytettäessä linkitettyä rakennetta ja tilavaatimuksen ollessa O(n). operaatio size, isempty positions, elements swap, replace(v,e) root, parent children(v) O(c v ) isinternal, isexternal, isroot suoritusaika O(n) 5. kappale 243 Yleisten puiden esittäminen binääripuiden avulla Yleisen puun T vaihtoehtoinen esitystapa edellä esitetylle on muuntaa se binääripuuksi T (kuva 5.18.). Puu T on järjestetty tai mielivaltaisessa järjestyksessä. Muunnos on seuraava: Puun T jokaisella solmulla u on olemassa puun T sisäsolmu u, joka liittyy solmuun u. Jos puun T solmu u on lehti, jolla ei ole sitä seuraavia sisaruksia, niin puun T solmun u lapset ovat lehtiä. Jos puun T solmu u on sisäsolmu ja v on u:n ensimmäinen lapsi, niin v on u :n vasen lapsi puussa T. Jos solmulla v on sisarus w välittömästi seuraavana, niin w on v :n oikea lapsi T :ssa. Puun T lehdet eivät liity puun T solmuihin, vaan ovat ainoastaan paikanpitäjiä. 5. kappale 244

23 A A B B C D E F G (a) E F C G D On helppoa ylläpitää puiden T ja T vastaavuus sekä ilmaista operaatiot T:ssä vastaavien operaatioiden suhteen T :ssa. Voidaan ajatella muunnos puusta T puuhun T niin, että otetaan kukin joukko {v 1, v 2,, v k sisaruksia puusta T vanhempanaan v ja korvataan se oikeanpuoleisten lapsien ketjulla, jonka juuri on solmussa v 1. Tästä puolestaan tulee solmun v vasen lapsi. Kuva Yleisen puun esitys binääripuun avulla: (a) puu T ja (b) edelliseen liittyvä puu T. Katkoviivat yhdistävät T :n solmut, jotka liittyvät T:n sisarussolmuihin. (b) 5. kappale 245 Taulukossa 5.4. on yleisen puun metodien suoritusajat käytettäessä kuvatulla tavalla binääripuuta sen toteutuksena. 5. kappale 246 Taulukko 5.4. Binääripuun (linkitetty rakenne) avulla toteutetun puun metodien suoritusajat, missä puun solmujen määrä on n, solmun v lasten määrä c v ja sisarusten määrä s v. Metodien elements(), positions() ja children(v) käyttämät metodit hasmoreelements() ja nextelement() vaativat ajan. Tilavaatimus on O(n). operaatio suoritusaika size, isempty positions, elements O(n) swap, replace(v,e) root parent(v) O(s v ) children(v) O(c v ) isinternal, isexternal, isroot 5. kappale 247

4. Puut. Kuva 4.1. Sukupuu Puun abstrakti tietotyyppi

4. Puut. Kuva 4.1. Sukupuu Puun abstrakti tietotyyppi 4. Puut Aabraham Seuraavaksi käsitellään yhtä tärkeimmistä tietojenkäsittelytieteen ei-lineaarisista käsitteistä, puuta (tree). Puut ovat olleet keksintönä todellinen läpimurto, koska niissä luotiin tehokas

Lisätiedot

puuta tree hierarkkinen hierarchical

puuta tree hierarkkinen hierarchical 4. Puut Seuraavaksi käsitellään yhtä tärkeimmistä tietojenkäsittelytieteen ei-lineaarisista käsitteistä, puuta (tree). Puut ovat olleet keksintönä todellinen läpimurto, koska niissä luotiin tehokas eilineaari

Lisätiedot

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

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Kukin alkio (viite) talletettuna solmuun (node) vastaa paikan käsitettä

Lisätiedot

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

Miten käydä läpi puun alkiot (traversal)? inääripuut ieman lisää aidon binääripuun ominaisuuksia lehtisolmuja on yksi enemmän kuin sisäsolmuja inääripuut tasolla d on korkeintaan 2 d solmua pätee myös epäaidolle binääripuulle taso 0: 2 0 = 1 solmu

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT 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.

Lisätiedot

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina Hakupuut tässä luvussa tarkastelemme puita tiedon tallennusrakenteina hakupuun avulla voidaan toteuttaa kaikki joukko-tietotyypin operaatiot (myös succ ja pred) pahimman tapauksen aikavaativuus on tavallisella

Lisätiedot

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento

Lisätiedot

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento

Lisätiedot

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

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin. 3. Hakupuut Hakupuu on listaa tehokkaampi dynaamisen joukon toteutus. Erityisesti suurilla tietomäärillä hakupuu kannattaa tasapainottaa, jolloin päivitysoperaatioista tulee hankalampia toteuttaa mutta

Lisätiedot

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö Algoritmit 2 Luento 4 To 21.3.2019 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2019 Luento 4

Lisätiedot

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö Algoritmit 1 Luento 7 Ti 31.1.2017 Timo Männikkö Luento 7 Järjestetty binääripuu Binääripuiden termejä Binääripuiden operaatiot Solmun haku, lisäys, poisto Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017

Lisätiedot

1.1 Tavallinen binäärihakupuu

1.1 Tavallinen binäärihakupuu TIE-20100 Tietorakenteet ja algoritmit 1 1 Puurakenteet http://imgur.com/l77fy5x Tässä luvussa käsitellään erilaisia yleisiä puurakenteita. ensin käsitellään tavallinen binäärihakupuu sitten tutustutaan

Lisätiedot

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö Algoritmit 1 Luento 8 Ke 1.2.2017 Timo Männikkö Luento 8 Järjestetty binääripuu Solmujen läpikäynti Binääripuun korkeus Binääripuun tasapainottaminen Graafit ja verkot Verkon lyhimmät polut Fordin ja Fulkersonin

Lisätiedot

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.

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. Yleiset hakupuut 4 Monitiehakupuu: Binäärihakupuu 0 1 3 5 6 7 8 v k 1 k k 3 v v 3 v 4 k 1 k 3 k 1 k k k 3 d lapsisolmua d 1 avainta Yleinen hakupuu? Tietorakenteet, syksy 007 1 Esimerkki monitiehakupuusta

Lisätiedot

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

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta AVL-puut eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta pohjana jo esitetyt binäärihakupuiden operaatiot tasapainotus vie pahimmillaan lisäajan lisäys- ja

Lisätiedot

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

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla; Tietorakenteet, laskuharjoitus 7, ratkaisuja 1. Opiskelijarekisteri-luokka saadaan toteutetuksi käyttämällä kahta tasapainotettua binäärihakupuuta. Toisen binäärihakupuun avaimina pidetään opiskelijoiden

Lisätiedot

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut 58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut 1. Palautetaan vielä mieleen O-notaation määritelmä. Olkoon f ja g funktioita luonnollisilta luvuilta positiivisille

Lisätiedot

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö Algoritmit 2 Luento 4 Ke 22.3.2017 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2017 Luento 4

Lisätiedot

Kysymyksiä koko kurssista?

Kysymyksiä koko kurssista? Kysymyksiä koko kurssista? Lisää kysymyksesi osoitteessa slido.com syötä event code: #8777 Voit myös pyytää esimerkkiä jostain tietystä asiasta Vastailen kysymyksiin luennon loppupuolella Tätä luentoa

Lisätiedot

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Tietorakenteet, laskuharjoitus 3, ratkaisuja Tietorakenteet, laskuharjoitus 3, ratkaisuja 1. (a) Toistolauseen runko-osassa tehdään yksi laskuoperaatio, runko on siis vakioaikainen. Jos syöte on n, suoritetaan runko n kertaa, eli aikavaativuus kokonaisuudessaan

Lisätiedot

7. Tasapainoitetut hakupuut

7. Tasapainoitetut hakupuut 7. Tasapainoitetut hakupuut Tässä luvussa jatketaan järjestetyn sanakirjan tarkastelua esittämällä kehittynyt puutietorakenne. Luvussa 7.1. esitetään monitiehakupuun käsite. Se on järjestetty puu, jonka

Lisätiedot

Binäärihaun vertailujärjestys

Binäärihaun vertailujärjestys Järjestetyn sanakirjan tehokas toteutus: binäärihaku Binäärihaku (esimerkkikuassa aain = nimi) op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea

Lisätiedot

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

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

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00 A274101 TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE 9.2.2005 KLO 12:00 PISTETILANNE: www.kyamk.fi/~atesa/tirak/harjoituspisteet-2005.pdf Kynätehtävät palautetaan kirjallisesti

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

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.

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, laskuharjoitus 11, ratkaisuja 1. Leveyssuuntaisen läpikäynnin voi toteuttaa rekursiivisesti käsittelemällä jokaisella rekursiivisella kutsulla kaikki tietyllä tasolla olevat solmut. Rekursiivinen

Lisätiedot

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu 832A Tietorakenteet ja algoritmit, 204-205, Harjoitus 7, ratkaisu Hajota ja hallitse-menetelmä: Tehtävä 7.. Muodosta hajota ja hallitse-menetelmää käyttäen algoritmi TULOSTA_PUU_LASKEVA, joka tulostaa

Lisätiedot

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

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Matti Nykänen 5. joulukuuta 2003 1 Satelliitit Muunnetaan luennoilla luonnosteltua toteutusta seuraavaksi: Korvataan puusolmun p kentät p. key ja

Lisätiedot

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö Algoritmit 2 Luento 6 To 28.3.2019 Timo Männikkö Luento 6 B-puun operaatiot Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 2/30 B-puu 40 60 80 130 90 100

Lisätiedot

3. Binääripuu, Java-toteutus

3. Binääripuu, Java-toteutus 3. Binääripuu, Java-toteutus /*-------------------------------------------------------------/ / Rajapinta SearchTree: binäärisen hakupuun käsittelyrajapinta / / Metodit: / / void insert( Comparable x );

Lisätiedot

Tietorakenteet, laskuharjoitus 6,

Tietorakenteet, laskuharjoitus 6, Tietorakenteet, laskuharjoitus, 23.-2.1 1. (a) Kuvassa 1 on esitetty eräät pienimmistä AVL-puista, joiden korkeus on 3 ja 4. Pienin h:n korkuinen AVL-puu ei ole yksikäsitteinen juuren alipuiden keskinäisen

Lisätiedot

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö 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

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

1 Puu, Keko ja Prioriteettijono

1 Puu, Keko ja Prioriteettijono TIE-20100 Tietorakenteet ja algoritmit 1 1 Puu, Keko ja Prioriteettijono Tässä luvussa käsitellään algoritmien suunnitteluperiaatetta muunna ja hallitse (transform and conquer) Lisäksi esitellään binääripuun

Lisätiedot

Luku 8. Aluekyselyt. 8.1 Summataulukko

Luku 8. Aluekyselyt. 8.1 Summataulukko Luku 8 Aluekyselyt Aluekysely on tiettyä taulukon väliä koskeva kysely. Tyypillisiä aluekyselyitä ovat, mikä on taulukon välin lukujen summa tai pienin luku välillä. Esimerkiksi seuraavassa taulukossa

Lisätiedot

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö Algoritmit 2 Luento 6 Ke 29.3.2017 Timo Männikkö Luento 6 B-puun operaatiot B-puun muunnelmia Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2017 Luento 6 Ke 29.3.2017 2/31 B-puu

Lisätiedot

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö Algoritmit 1 Luento 12 Ti 19.2.2019 Timo Männikkö Luento 12 Osittamisen tasapainoisuus Pikalajittelun vaativuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu Algoritmit

Lisätiedot

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Tietorakenteet, laskuharjoitus 7, ratkaisuja Tietorakenteet, laskuharjoitus, ratkaisuja. Seuraava kuvasarja näyttää B + -puun muutokset lisäysten jälkeen. Avaimet ja 5 mahtuvat lehtisolmuihin, joten niiden lisäys ei muuta puun rakennetta. Avain 9

Lisätiedot

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö Algoritmit 1 Luento 12 Ke 15.2.2017 Timo Männikkö Luento 12 Pikalajittelu Pikalajittelun vaativuus Osittamisen tasapainoisuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu

Lisätiedot

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

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ... 1. Tietorakenteet Tietorakenteet organisoivat samankaltaisten olioiden muodostaman tietojoukon. Tämä järjestys voidaan saada aikaan monin tavoin, esim. Keräämällä oliot taulukkoon. Liittämällä olioihin

Lisätiedot

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö Algoritmit 1 Luento 6 Ke 25.1.2017 Timo Männikkö Luento 6 Järjestetty lista Listan toteutus dynaamisesti Linkitetyn listan operaatiot Vaihtoehtoisia listarakenteita Puurakenteet Binääripuu Järjestetty

Lisätiedot

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö Algoritmit 2 Luento 5 Ti 28.3.2017 Timo Männikkö Luento 5 Puurakenteet B-puu B-puun korkeus B-puun operaatiot Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 2/29 B-puu Algoritmit 2 Kevät 2017 Luento 5 Ti

Lisätiedot

Muita linkattuja rakenteita

Muita linkattuja rakenteita 1 Muita linkattuja rakenteita Johdanto Aikaisemmin on käsitelty listan, jonon ja pinon toteutus dynaamisesti linkattuna rakenteena. Dynaamisella linkkauksella voidaan toteuttaa mitä moninaisimpia rakenteita.

Lisätiedot

10. Painotetut graafit

10. Painotetut graafit 10. Painotetut graafit Esiintyy monesti sovelluksia, joita on kätevä esittää graafeina. Tällaisia ovat esim. tietoverkko tai maantieverkko. Näihin liittyy erinäisiä tekijöitä. Tietoverkkoja käytettäessä

Lisätiedot

Rajapinta (interface)

Rajapinta (interface) 1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä

Lisätiedot

Kierros 4: Binäärihakupuut

Kierros 4: Binäärihakupuut Kierros 4: Binäärihakupuut Tommi Junttila Aalto University School of Science Department of Computer Science CS-A1140 Data Structures and Algorithms Autumn 2017 Tommi Junttila (Aalto University) Kierros

Lisätiedot

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

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa Kekolajittelu Prioriteettijonolla toteutettu keko InsertItem ja RemoveMinElem: O(log(n)) Lajittelu prioriteettijonolla: PriorityQueueSort(lajiteltava sekvenssi S) alusta prioriteettijono P while S.IsEmpty()

Lisätiedot

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 9. marraskuuta 2009

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 9. marraskuuta 2009 TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 9. marraskuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Vaihe E tiistai

Lisätiedot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

Lisätiedot

CS-A1140 Tietorakenteet ja algoritmit

CS-A1140 Tietorakenteet ja algoritmit CS-A1140 Tietorakenteet ja algoritmit Kierros 4: Binäärihakupuut Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 2016 Sisältö Binäärihakupuut Avainten lisääminen,

Lisätiedot

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu 1312A Tietorakenteet ja algoritmit, 2016-2017, Harjoitus 5, Ratkaisu Harjoituksen aihe ovat hash-taulukot ja binääriset etsintäpuut Tehtävä 5.1 Tallenna avaimet 10,22,31,4,15,28,17 ja 59 hash-taulukkoon,

Lisätiedot

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 1.1. (a) Jaettava m, jakaja n. Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena. Jos jäljelle jää nolla, jaettava oli tasan jaollinen. int m,

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta 811312A Tietorakenteet ja algoritmit 2017-2018 Kertausta kurssin alkuosasta II Perustietorakenteet Pino, jono ja listat tunnettava Osattava soveltaa rakenteita algoritmeissa Osattava päätellä operaatioiden

Lisätiedot

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

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen Viimeksi käsiteltiin pino: lisäys ja poisto lopusta jono: lisäys loppuun, poisto alusta Pinon ja jonon yleistävä tietorakenne: kaksiloppuinen jono alkion lisäys/poisto voidaan kohdistaa jonon alkuun tai

Lisätiedot

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista 811312A Tietorakenteet ja algoritmit 2016-2017 III Lajittelualgoritmeista Sisältö 1. Johdanto 2. Pikalajittelu 3. Kekolajittelu 4. Lajittelualgoritmien suorituskyvyn rajoista 811312A TRA, Lajittelualgoritmeista

Lisätiedot

4. Sekvenssit Astetta soveltavat sekvenssit

4. Sekvenssit Astetta soveltavat sekvenssit 4. Sekvenssit Sekvenssit edustavat lineaarisesti järjestettyä alkioiden kokoelmaa, jolle on määritelty metodit alkion saantia, lisäystä ja poistoa varten. Täten sen jokaisella alkiolla on edeltäjä, paitsi

Lisätiedot

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen) TKT0001 Tietorakenteet ja algoritmit Erilliskoe 5.1.01, malliratkaisut (Jyrki Kivinen) 1. [1 pistettä] (a) Esitä algoritmi, joka poistaa kahteen suuntaan linkitetystä järjestämättömästä tunnussolmullisesta

Lisätiedot

8. Lajittelu, joukot ja valinta

8. Lajittelu, joukot ja valinta 8. Lajittelu, joukot ja valinta Yksi tietojenkäsittelyn klassisista tehtävistä on lajittelu (järjestäminen) (sorting) jo mekaanisten tietojenkäsittelylaitteiden ajalta. Lajiteltua tietoa tarvitaan lukemattomissa

Lisätiedot

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

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

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja 1 Tietorakenteet (kevät 08) 1. kurssikoe, ratkaisuja Tehtävän 1 korjasi Mikko Heimonen, tehtävän 2 Jaakko Sorri ja tehtävän Tomi Jylhä-Ollila. 1. (a) Tehdään linkitetty lista kaikista sukunimistä. Kuhunkin

Lisätiedot

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun: Tietorakenteet ja algoritmit, kevät 201 Kurssikoe 1, ratkaisuja 1. Tehtävästä sai yhden pisteen per kohta. (a) Invariantteja voidaan käyttää algoritmin oikeellisuustodistuksissa Jokin väittämä osoitetaan

Lisätiedot

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero Alkioiden avaimet Usein tietoalkioille on mielekästä määrittää yksi tai useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero 80 op

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

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

Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min Koe Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min Kokeessa saa olla mukana A4:n kokoinen kaksipuolinen käsiten tehty, itse kirjoitettu lunttilappu 1 Tärkeää ja vähemmäntärkeää Ensimmäisen

Lisätiedot

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmi on periaatteellisella tasolla seuraava: Algoritmi on periaatteellisella tasolla seuraava: Dijkstra(V, E, l, v 0 ): S := { v 0 } D[v 0 ] := 0 for v V S do D[v] := l(v 0, v) end for while S V do valitse v V S jolle D[v] on minimaalinen S := S

Lisätiedot

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

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia 58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, 25.2.2013, vastauksia 1. (a) O-merkintä Ω-merkintä: Kyseessä on (aika- ja tila-) vaativuuksien kertalukumerkinnästä. O-merkintää käytetään ylärajan

Lisätiedot

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot

Lisätiedot

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio)

Lisätiedot

6. Sanakirjat. 6. luku 298

6. Sanakirjat. 6. luku 298 6. Sanakirjat Tässä luvussa tarkastellaan käsitettä sanakirja (dictionary). Tällaisen tietorakenteen tehtävä on tallettaa alkioita niin, että tiedonhaku rakenteesta on tehokasta. Nimi vastaa melko hyvin

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,

Lisätiedot

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö Algoritmit 2 Luento 9 Ti 17.4.2018 Timo Männikkö Luento 9 Merkkitiedon tiivistäminen Huffmanin koodi LZW-menetelmä Taulukointi Editointietäisyys Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 2/29 Merkkitiedon

Lisätiedot

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia 58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, 10..2014, vastauksia 1. [9 pistettä] (a) Todistetaan 2n 2 + n + 5 = O(n 2 ): Kun n 1 on 2n 2 + n + 5 2n 2 + n 2 +5n 2 = 8n 2. Eli

Lisätiedot

Datatähti 2019 loppu

Datatähti 2019 loppu Datatähti 2019 loppu task type time limit memory limit A Summa standard 1.00 s 512 MB B Bittijono standard 1.00 s 512 MB C Auringonlasku standard 1.00 s 512 MB D Binääripuu standard 1.00 s 512 MB E Funktio

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

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

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut Tietorakenteet ja algoritmit (syksy 0) Toinen välikoe, malliratkaisut. (a) Alussa puu näyttää tältä: Lisätään 4: 4 Tasapaino rikkoutuu solmussa. Tehdään kaksoiskierto ensin oikealle solmusta ja sitten

Lisätiedot

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö Algoritmit 2 Luento 14 Ke 3.5.2017 Timo Männikkö Luento 14 Ositus ja rekursio Rekursion toteutus Kertaus ja tenttivinkit Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 2/30 Ositus Tehtävän esiintymä ositetaan

Lisätiedot

14 Tasapainotetut puurakenteet

14 Tasapainotetut puurakenteet TIE-20100 Tietorakenteet ja algoritmit 308 14 Tasapainotetut puurakenteet Binäärihakupuu toteuttaa kaikki dynaamisen joukon operaatiot O(h) ajassa Kääntöpuolena on, että puu voi joskus litistyä listaksi,

Lisätiedot

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen)

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen) 58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen) 1. Lisäysjärjestämisessä järjestetään ensin taulukon kaksi ensimmäistä lukua, sitten kolme ensimmäistä lukua, sitten neljä ensimmäistä

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

58131 Tietorakenteet ja algoritmit (syksy 2015)

58131 Tietorakenteet ja algoritmit (syksy 2015) 58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta 811312A Tietorakenteet ja algoritmit 2016-2017 Kertausta kurssin alkuosasta II Algoritmien analyysi: oikeellisuus Algoritmin täydellinen oikeellisuus = Algoritmi päättyy ja tuottaa määritellyn tuloksen

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

B + -puut. Kerttu Pollari-Malmi

B + -puut. Kerttu Pollari-Malmi B + -puut Kerttu Pollari-Malmi Tämä monista on alunperin kirjoitettu sksn 2005 kurssille osittain Luukkaisen ja Nkäsen vanhojen luentokalvojen pohjalta. Maaliskuussa 2010 pseudokoodiesits on muutettu vastaamaan

Lisätiedot

Tietorakenteet (syksy 2013)

Tietorakenteet (syksy 2013) Tietorakenteet (syksy 2013) Harjoitus 1 (6.9.2013) Huom. Sinun on osallistuttava perjantain laskuharjoitustilaisuuteen ja tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. Näiden laskuharjoitusten

Lisätiedot

Stabiloivat synkronoijat ja nimeäminen

Stabiloivat synkronoijat ja nimeäminen Stabiloivat synkronoijat ja nimeäminen Mikko Ajoviita 2.11.2007 Synkronoija Synkronoija on algoritmi, joka muuntaa synkronoidun algoritmin siten, että se voidaan suorittaa synkronoimattomassa järjestelmässä.

Lisätiedot

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä Luku 7 Verkkoalgoritmit Verkot soveltuvat monenlaisten ohjelmointiongelmien mallintamiseen. Tyypillinen esimerkki verkosta on tieverkosto, jonka rakenne muistuttaa luonnostaan verkkoa. Joskus taas verkko

Lisätiedot

Johdatus graafiteoriaan

Johdatus graafiteoriaan Johdatus graafiteoriaan Syksy 2017 Lauri Hella Tampereen yliopisto Luonnontieteiden tiedekunta 126 Luku 3 Puut 3.1 Puu 3.2 Virittävä puu 3.3 Virittävän puun konstruointi 3.4 Minimaalinen virittävä puu

Lisätiedot

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi. 11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot