4. Puut. Kuva 4.1. Sukupuu Puun abstrakti tietotyyppi

Koko: px
Aloita esitys sivulta:

Download "4. Puut. Kuva 4.1. Sukupuu Puun abstrakti tietotyyppi"

Transkriptio

1 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 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 metafora voisi tulla kenties sukupuista, kuten kuvassa 4.1. Ruuben Simeon Leevi Kuva 4.1. Sukupuu. 4. luku luku 152 Kännykkä Oyj 4.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 4.2. tavoin. kotimaa ulkomaat pohjoismaat muu Eurooppa muut maanosat laitteisto Afrikka Amerikat Aasia Australia ohjelmisto Kuva 4.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. 4. luku luku 154

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 4.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. 4. luku luku 156 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... l25 Puu T on solmujen joukko, joka tallettaa alkiot vanhempi-lapsisuhteessa: viikkoharjoitukset vh1... vh13 harjoitustyö Kuva 4.3. Tämä on tiedostojärjestelmän osa, jossa tietorakenteet-kurssin alipuu sisältää 42 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 4.4.). 4. luku luku 158

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 4.4. Kirjan rakenne esitetty puuna. 4. luku luku 160 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 4.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 4.5. Binääri päätöspuu tutkittaessa huimauspotilaalta hyvänlaatuisen asentohuimauksen mahdollisuutta diagnoosina. 4. luku luku 162

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 4.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 4.6. tapaus voisi olla rajoitettu tapaus. / Kuva 4.6. Tämä on aritmeettista lauseketta esittävä binääripuu. Lauseke on (((3 + 1) 3) / ((9 5) + 2)) ((3 (7 4)) + 6)) luku luku 164 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 4. luku 165 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ä. 4. luku 166

5 Edellisten lisäksi myös seuraavat ovat monesti tarpeen: Oheiset yleisluontoiset metodit, jotka eivät sinänsä riipu puusta tietorakenteena, ovat hyödyllisiä puiden yhteydessä: isinternal(v): Testaa, onko solmu v sisäsolmu. Syöte: solmu Tulos: totuusarvo size(): Palauttaa puun T solmujen lukumäärän. Tulos: kokonaisluku 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. 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 4. luku luku 168 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 4.1. yhteydessä, ja koodin 4.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 4.1. PositionalContainer-rajapinta. 4. luku luku 170

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 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 4.1. (jatkoa) PositionalContainer-rajapinta. Koodi 4.2. SimpleTree-rajapinta 4. luku luku Puiden perusalgoritmeja Kuvataan puunkäsittelyalgoritmeja, jotka suorittavat tehtävänsä päästen puuhun käsiksi koodin 4.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 O(1). Metodit root() ja parent(v) toimivat ajassa O(1). Boolen-tyyppiset metodit isinternal(v), isexternal(v) ja isroot(v) toimivat myös ajassa O(1). Metodit elements() ja positions() toimivat ajassa O(n), jossa n on puun solmujen lukumäärä. 4. luku 173 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 O(1). Myöhemmin, luvussa 4.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 4.2. solmun ulkomaat syvyys on 2. Täten juuren syvyys on 0. Solmun syvyys on määriteltävissä rekursiivisesti: 4. luku 174

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 4.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 (4.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, T.parent(v))); Koodi 4.3. Metodi depth solmun syvyyden tutkimista varten. 4. luku luku 176 Solmun v korkeus (height) puussa T rekursiivisesti: Jos v on ulkosolmu eli lehti, sen korkeus on 0. määritellään niin ikään 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 4.2. puun korkeus on 4. Puun korkeuden voi mieltää myös sen maksimisyvyytenä jostakin solmusta, joka on sen lehti. Seuraavassa on algoritmi korkeuden laskemista varten. Koodi 4.4. (alkuosa) Metodi height1 solmun korkeuden laskemista varten. 4. luku luku 178

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 4.4. (loppuosa) Metodi height1 solmun korkeuden laskemista varten. Mukana on tyypinmuunnos geneerisestä oliosta Position-olioon sekä metodin max käyttämistä. Koodin 4.4. metodi height1 on hyvin yksinkertainen toimintaidealtaan. Se käy läpi kaikki solmut, laskee lehtien korkeudet koodin 4.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. 4. luku luku 180 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 O(1), niin jokaiselle solmulle tarvitaan siis aikaa O(c v ), ja kaikkiaan sitä vaaditaan Lause 4.1. Olkoon T puu, jossa on n solmua, ja olkoon c v puun T solmun v lasten lukumäärä. Silloin on Perustelu: Lukuunottamatta juurta puun T jokainen solmu on jonkin toisen solmun lapsi, mikä aikaansaa mainitun sarjan summan. 4. luku luku 182

9 Puun kulkeminen esijärjestyksessä Puun T kulkeminen (traversal) merkitsee järjestelmällistä tapaa vuorotellen käydä solmuissa eli saada kukin solmu. 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) 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 4.5., jossa sitä aluksi kutsutaan käskyllä preorder(t,t.root()). Koodi 4.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. 4. luku luku 184 otsikko abstrakti johdanto julkaisu 2. menetelmät 3. tulokset viitteet Kuva 4.7. Puun käynti esijärjestyksessä, jossa jokaisen solmun lapset ovat järjestettyinä vasemmalta oikealle. Esim Dokumenttiin liittyvä, kuten esim. 4.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 O(1). Tällöin analyysi muistuttaa edellä mainittua tehokasta puun korkeuden laskentaa, joka toimi lineaarisessa ajassa. Esijärjestys-algoritmin ei-rekursiivinen osa vaatii jokaisessa solmussa v aikaa O(c v ), missä c v on solmun v lasten lukumäärä. Lauseen 4.1. mukaan esijärjestys-algoritmin suoritusajaksi tulee O(n). Koodin 4.6. algoritmi kulkee rekursiivisesti puun esijärjestyksessä ja tulostaa kunkin solmun alkion. 4. luku luku 186

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 4.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 4.7). Jos puu on järjestetty, solmun lasten käsittelyn rekursiiviset kutsut tehdään ko. järjestyksen mukaisesti. 4. luku luku 188 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 4.7. Jälkijärjestys-algoritmi Menetelmän nimi tulee käyntijärjestyksestä, jossa ensin käydään solmun lapsissa ennen itse solmua (kuva 4.8.). Menetelmän analyysi on samankaltainen kuin esijärjestyksellä. Se on O(n), kun yhdessä solmussa käynti vaatii vakioajan. Kuva 4.8. Puun kuvasta 4.7. käynti jälkijärjestyksessä. 4. luku luku 190

11 Jälkijärjestyksessä kulkemisesta on esimerkkinä rekursiivinen metodi postorderprint koodina 4.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 4.8. Algoritmi postorderprint. 4. luku 191 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ä. 4. luku 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 4.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 4.9. tapaan. 4. luku luku 194

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 4.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 4.10.). 4. luku luku 196 taso solmuja Oheiset ominaisuudet ovat johdettavissa kuvan havainnollistamana koskien binääripuun korkeutta ja solmujen määrää. Lause 4.3. Olkoon T aito 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. 4. luku luku 198

13 Lauseen 4.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 4. luku luku 200 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 4.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. luvussa. 4. luku 201 Mallinnetaan binääripuuta abstraktina tietotyyppinä koodin 4.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 4.9. (alku) Rajapinta BinaryTree, joka laajentaa rajapintaa SimpleTree. 4. luku 202

14 // Update methods: public void expandexternal(position v); public Object removeaboveexternal(position v); } Koodi 4.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 O(1), koska jokaisella solmulla on joko ei yhtään tai kaksi lasta. Metodit leftchild(v) ja rightchild(v) toimivat ajassa O(1). Metodit expandexternal(v) ja removeaboveexternal(v) toimivat ajassa O(1). 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 4.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 4.11.). 4. luku luku 204 Algorithm binarypreorder(t,v): käy solmussa v (ja tee siellä tarvittava laskenta) if v on sisäsolmu then binarypreorder(t,t.leftchild(v)) binarypreorder(t,t.rightchild(v)) Koodi Algoritmi binarypreorder. {käy rekursiivisesti vasemmassa alipuussa} {käy rekursiivisesti oikeassa alipuussa} Kun solmussa käyminen vaatii ajan O(1), 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. 4. luku luku 206

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 4.13.). 4. luku luku 208 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 4.11) Kuva Binääripuun kulkeminen välijärjestyksessä luku luku 210

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 4.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. 4. luku 211 Binäärihakupuuta 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öhemmin, luvussa 6.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ä. 4. luku 212 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. 4. luku 213 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 4.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). 4. luku 214

17 Solmun v ollessa lehti kaikki kolme käyntiä tapahtuvat itse asiassa samalla kertaa. Menetelmä on esitetty algoritmina koodissa / Kuva Eulerin matka binääripuussa. 6 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. 4. luku luku Puutietorakenteiden toteuttaminen 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. Seuraavaksi tarkastellaan puiden konkreettista esittämistä tietorakenteina sekä puun ja binääripuun abstrakteja tietotyyppejä. 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ää. 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 4.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) luku luku 218

18 / (a) Kuva Binääripuun tasojen numerointi: (a) yleinen kaavio. Kuva (jatkoa) Binääripuun tasojen numerointi: (b) esimerkki. 4. luku luku 220 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 4.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 O(1). S / Kuva Binääripuuesitys sekvenssin avulla. T luku luku 222

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. Taulukko 4.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 O(1). 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 O(1). Taulukossa 4.1. on yhteenveto binääripuutoteutuksen metodien suoritusajoista sekvenssiä käytettäessä. Sekvenssi on tässä tehokas, mutta korkeille puille muistitilan käyttö on tehotonta. 4. luku luku 224 Binääripuiden linkitetty rakenne solmu v 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 4.16.). Solmu v on esitettävissä 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. Tarvitaan myös metodit, joilla muuttujien arvot saadaan ja asetetaan. 4. luku 225 vasen alkio oikea (a) Baltimore Chicago New York Providence Seattle (b) Kuva Binääripuutoteutus linkitettynä rakenteena: (a) solmun v olio ja (b) viiden solmun binääripuu kokonaisuudessaan. 4. luku 226

20 Seuraavassa on lueteltu normaalisti tarvitut metodit, joiden nimi kertoo tehtävän. Metodit size() ja isempty() toimivat ajassa O(1). Metodissa swap(v,w) yksinkertaisesti vaihdetaan alkioiden v ja w viittaukset keskenään. Se toimii ajassa O(1). Myös metodi replace(v,e) on toteutettavissa toimivaksi ajassa O(1). Käyttäen sekvenssiä ja paikkaa siinä operaatiot elements(), positions() ja children() ovat toteutettavissa. Niissä käytettävät apumetodit hasmoreelements() ja nextelement() toimivat ajassa O(1). 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). Jokaista puun T solmua varten on olio. Puuta itseään varten on oma olionsa. 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 4.2. on yhteenveto binääripuun metodien suoritusaikavaatimuksista. Taulukko 4.2. Binääripuun (n solmua) metodien suoritusajat linkitettyä rakennetta käytettäessä. Muistitilavaatimus on O(n). 4. luku luku 228 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(). 4. luku 229 lasten säiliö (a) Baltimore Chicago Providence Seattle (b) Kuva Yleisen puun linkitetty rakenne: (a) solmuun liitetty olio ja (b) osa tietorakennetta, jossa on solmu lapsineen. 4. luku 230

21 Taulukko 4.3. esittää linkitetyn rakenteen toteutusten suorituskyvyn. Operaatioiden analyysi jääköön lukijalle. Taulukko 4.3. Yleisen puun (n solmua ja c v solmun v lapset) metodien suoritusajat käytettäessä linkitettyä rakennetta ja tilavaatimuksen ollessa O(n). Yleisten puiden esittäminen binääripuiden avulla Yleisen puun T vaihtoehtoinen esitystapa edellä esitetylle on muuntaa se binääripuuksi T (kuva 4.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. 4. luku 231 Puun T lehdet eivät liity puun T solmuihin, vaan ovat ainoastaan paikanpitäjiä. 4. luku 232 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. (b) Taulukossa 4.4. on yleisen puun metodien suoritusajat käytettäessä kuvatulla tavalla binääripuuta sen toteutuksena. 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. 4. luku luku 234

22 Taulukko 4.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 O(1). Tilavaatimus on O(n). 4. luku 235

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

5. Puut. Kuva 5.1. Sukupuu Puun abstrakti tietotyyppi

5. Puut. Kuva 5.1. Sukupuu Puun abstrakti tietotyyppi 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

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

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 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

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 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

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

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

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

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

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

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

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

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

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

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

private TreeMap nimella; private TreeMap 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

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

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

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

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

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

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 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

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

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

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

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

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

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

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 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

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

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

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

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 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

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

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

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

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

(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

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

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

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

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

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

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

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

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

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 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

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

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

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

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

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

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

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

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

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

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

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

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

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

Datatähti 2000: alkukilpailun ohjelmointitehtävä

Datatähti 2000: alkukilpailun ohjelmointitehtävä Datatähti 2000: alkukilpailun ohjelmointitehtävä 1 Lyhyt tehtävän kuvaus Tehtävänä on etsiä puurakenteen esiintymiä kirjaintaulukosta. Ohjelmasi saa syötteenä kirjaintaulukon ja puun, jonka jokaisessa

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

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

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

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1 Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,

Lisätiedot

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

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset Luku 4 Tietorakenteet funktio-ohjelmoinnissa Koska funktio-ohjelmoinnissa ei käytetä tuhoavaa päivitystä (sijoituslausetta ja sen johdannaisia), eivät läheskään kaikki valtavirtaohjelmoinnista tutut tietorakenteet

Lisätiedot

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet ) T-79144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet 11-22) 26 29102004 1 Ilmaise seuraavat lauseet predikaattilogiikalla: a) Jokin porteista on viallinen

Lisätiedot

4. Joukkojen käsittely

4. Joukkojen käsittely 4 Joukkojen käsittely Tämän luvun jälkeen opiskelija osaa soveltaa lomittuvien kasojen operaatioita tuntee lomittuvien kasojen toteutuksen binomi- ja Fibonacci-kasoina sekä näiden totetutusten analyysiperiaatteet

Lisätiedot

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Tietorakenteet ja algoritmit. Kertaus. Ari Korhonen

Tietorakenteet ja algoritmit. Kertaus. Ari Korhonen Tietorakenteet ja algoritmit Kertaus Ari Korhonen 1.12.2015 Tietorakenteet ja algoritmit - syksy 2015 1 Presemosta: 12. Kertaus» Mitkä tekijät, miten ja miksi vaiku1avat algoritmien nopeuteen» Rekursiohistoriapuut

Lisätiedot

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

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen) 58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen) 1. Avaimet 1, 2, 3 ja 4 mahtuvat samaan lehtisolmuun. Tässä tapauksessa puussa on vain yksi solmu, joka on samaan aikaan juurisolmu

Lisätiedot

Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan.

Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan. 5. Verkkoalgoritmeja Eräs keskeinen algoritmien suunnittelutekniikka on Palauta ongelma johonkin tunnettuun verkko-ongelmaan. Palauttaminen edellyttää usein ongelman ja algoritmin pientä modifioimista,

Lisätiedot

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public) Tietorakenteet JAVA-OHJELMOINTI Osa 5: Tietorakenteita Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Olioita ja tietoja voidaan organisoida määrämuotoisiksi tietorakenteiksi Hyödyllisiä

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

1 Määrittelyjä ja aputuloksia

1 Määrittelyjä ja aputuloksia 1 Määrittelyjä ja aputuloksia 1.1 Supremum ja infimum Aluksi kerrataan pienimmän ylärajan (supremum) ja suurimman alarajan (infimum) perusominaisuuksia ja esitetään muutamia myöhemmissä todistuksissa tarvittavia

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

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

15. Ohjelmoinnin tekniikkaa 15.1

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

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,

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

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

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

Oppijan saama palaute määrää oppimisen tyypin

Oppijan saama palaute määrää oppimisen tyypin 281 5. KONEOPPIMINEN Älykäs agentti voi joutua oppimaan mm. seuraavia seikkoja: Kuvaus nykytilan ehdoilta suoraan toiminnolle Maailman relevanttien ominaisuuksien päätteleminen havaintojonoista Maailman

Lisätiedot

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: Tietorakenteet, laskuharjoitus 10, ratkaisuja 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: SamaLuku(T ) 2 for i = 1 to T.length 1 3 if T [i] == T [i + 1] 4 return True 5 return

Lisätiedot