8. Puna-mustat puut ja tietorakenteiden täydentäminen

Koko: px
Aloita esitys sivulta:

Download "8. Puna-mustat puut ja tietorakenteiden täydentäminen"

Transkriptio

1 8. Puna-mustat puut ja tietorakenteiden täydentäminen Tässä osassa perehdytään puna-mustiin puihin, jotka toteuttavat yhden tavan pitää binäärinen hakupuu tasapainossa. Teoksessa [Cor] käsitellään puna-mustia puita luvussa 13. Tarkastelun lopuksi käsitellään vielä tietorakenteiden täydentämistä, johon perehdytään myös kirjan [Cor] luvussa 14. Tämän materiaalin osaamista ei vaadita kurssin tenteissä Puna-mustat puut Kaikkien edellä esitettyjen binääristen etsintäpuiden algoritmien aikakompleksisuus on luokkaa (h), kun h on käsiteltävän puun korkeus. Tällaisessa puussa voi olla 2 h 1solmua, joten puun ollessa tasapainossa (mikään alipuu ei ole muita alipuita selvästi korkeampi), algoritmien kompleksisuus on luokkaa (lg(n )), kun syötteen koon mittana käytetään avaimien lukumäärää n. Valitettavasti lisäys- ja poistoalgoritmit eivät välttämättä pidä puuta tasapainossa, vaan tuloksena syntynyt puu riippuu avaimien järjestyksestä. Esimerkiksi lisättäessä avaimet suuruusjärjestyksessä puuhun muodostuu vain yksi haara. Operaatioiden lukumäärä voi siis huonoimmassa tapauksessa riippua lineaarisesti avaimien lukumäärästä. Tämän vuoksi on kehitetty useita etsintäpuumalleja, joissa taataan puun tasapainon säilyminen ja siten logaritminen käsittelyaika kaikissa tapauksissa. Ensimmäinen tällainen etsintäpuun malli on vuonna 1962 esitelty AVL-puu, joka on saanut nimensä keksijöistään (Adelson-Velskii ja Landis). Näihin tietorakenteisiin voi tutustua mm. teoksen [Wei] luvusta 4.4. Tässä käsitellään tarkemmin puna-mustia puita (red-black trees), jotka ovat yksi tapa tasapainottaa binäärisiä etsintäpuita. Kirjan [Cor] luvusta 13 voi myös perehtyä aiheeseen. Puna-mustat puut ovat binäärisiä hakupuita, joiden solmuihin on lisätty väri: solmut ovat joko punaisia tai mustia. Binäärinen hakupuu on puna-musta puu, jos se toteuttaa seuraavat viisi ehtoa: 1. Jokainen solmu on joko punainen tai musta. 2. Juuri on musta. 3. Jokainen lehti (NIL) on musta. 4. Jos solmu on punainen, sen molemmat lapset ovat mustia. 5. Kaikille solmuille on voimassa: Jokainen polku solmusta sen jälkeläislehtiin sisältää saman lukumäärän mustia solmuja. HUOM! Puun lehdet ovat siis aina tyhjiä (NIL) ja ne merkitään aina mustiksi. Niitä ei välttämättä merkitä kuvioissa näkyviin. Kaikilla sisäsolmuilla on siis aina kaksi lasta, joista toinen tai molemmat voivat olla lehtiä. Juuren vanhemmaksi merkitään NIL, joka on siis musta.

2 Kuva 8.1. Kaksi binääristä etsintäpuuta, jotka eivät ole puna-mustia puita. Kuvasta on jätetty merkitsemättä mustat tyhjät lehtisolmut. Samoin juuren vanhempi. Edellä olevat kaksi puuta eivät kumpikaan ole hyvin muodostettuja puna-mustia puita. Vasemmanpuoleisessa puussa punaisella solmulla 10 on punainen lapsi 16, joten ominaisuus 4 ei ole voimassa. Oikeanpuoleisessa puussa taas solmun 28 vasemmanpuoleisessa polussa lehteen on yksi musta solmu enemmän kuin oikeanpuoleisessa solmussa, joten ominaisuus 5 ei toteudu. Seuraava puu on sen sijaan oikea puna-musta puu, kuten on helppo todeta Kuva 8.2. Esimerkki puna-mustasta puusta. Osoitetaan seuraavaksi, että puna-mustat puut ovat riittävän tasapainoisia toimiakseen hyvinä hakupuina. Käytetään seuraavaa merkintää: Kun x on puna-mustan puun solmu, sen mustakorkeus bh(x) on sen mustien jälkeläisten lukumäärä polussa solmusta x puun lehteen saakka. Huomaa, että ominaisuuden 5 perusteella on merkityksetöntä, mihin solmun x jälkeläislehteen menevää polkua tarkastellaan. Perustellaan seuraava ominaisuus: Olkoon x punamustan puun solmu. Tällöin alipuu, jonka juuri x on, sisältää vähintään 2 1solmua. Tämä bh( x) voidaan näyttää induktiivisesti solmun x korkeuden suhteen. Jos solmun x korkeus on 0, niin x on 0 bh( x) lehti, bh(x)=0 ja sen alipuussa on vähintään solmua, joten väite on voimassa. Olkoon sitten solmun x korkeus h > 0, jolloin solmu on sisäsolmu ja solmulla kaksi lasta. Oletetaan, että väite on voimassa solmuille, joiden korkeus on pienempi. Nyt solmun x lasten bh( x) 1 mustakorkeus on vähintään bh(x)-1 ja niiden alipuissa yhteensä vähintään 2*(2 1) solmua. bh( x) 1 bh( x) Näin ollen solmun x alipuussa on vähintään 2*(2 1) 1 2 1solmua. Tarkasteltava ominaisuus on siis aina voimassa

3 Todetaan että edellä havaitusta ominaisuudesta seuraa puun korkeuden logaritminen suhde solmujen lukumäärään: Jos puna-mustassa puussa on n solmua, niin puun korkeus on korkeintaan 2*lg( n 1). Olkoon nimittäin puun korkeus h. Puna-mustan puun ominaisuuksista 3 ja 4 seuraa, että juuren mustakorkeus on vähintään h/2, koska polulla juuresta lehteen vähintään joka toinen solmu on musta ja lehdet ovat aina mustia. Näin ollen puun solmujen lukumäärä n toteuttaa ehdon n 2 h / 2 1, mistä saadaan h/ 2 lg( n 1) ja h 2*lg( n 1). Puna-mustiin puihin voidaan luonnollisesti soveltaa binäärisen hakupuun algoritmeja avaimen etsimiseen sekä minimi- ja maksimiarvojen hakemiseen (edellisen osan algoritmit BST_ETSI, BST_MINIMI ja BST_MAKSIMI). Koska kaikki nämä algoritmit ovat kompleksisuudeltaan luokkaa (h), missä h on puun korkeus, niin edellä olevasta tarkastelusta seuraa heti, että punamustalle puulle algoritmien kompleksisuus on (lg n), missä n on puussa olevien avainten lukumäärä. Sen sijaan edellisessä osassa esitettyjä algoritmeja avainten lisäämiseen poistamiseen ei voi sellaisenaan soveltaa, sillä ne eivät välttämättä säilytä puuta puna-mustana. Puna-mustien puiden kunnossapidon perusoperaatio on rotaatio eli pyöritys. Pyöritys voidaan tehdä solmun suhteen joko vasemmalle tai oikealle. Vasen rotaatio voidaan tehdä mille tahansa solmulle, jonka oikea lapsi ei ole lehti. Samoin oikea rotaatio voidaan tehdä mille tahansa solmulle, jonka vasen lapsi ei ole lehti. Seuraava kuva havainnollistaa tilannetta x RBT_VASEN_ROTAATIO(T,x) y a y RBT_OIKEA_ROTAATIO(T,y) x c b c a b Kuva 8.3. Vasen ja oikea rotaatio. Edellä olevassa kuvassa solmut x ja y voivat olla punaisia tai mustia; solmun väri ei muutu rotaatiossa. Symbolit a, b ja c tarkoittavat solmujen alipuita. Huomaa, miten alipuu b vaihtaa vanhempaansa rotaatiossa. Vasemman rotaation pseudokoodi on esitetty seuraavassa:

4 Syöte: Binäärinen etsintäpuu T ja solmu x, jonka suhteen kierretään. Oletus: x.right!= NIL Tulostus: Suorittaa puussa vasemman rotaation solmun x suhteen RBT_VASEN_ROTAATIO(T,x) 1. y = x.right 2. x.right = y.left // y:n vasen alipuu x:n oikeaksi alipuuksi 3. if y.left!= NIL 4. y.left.p = x 5. y.p = x.p // x:n vanhempi y:n vanhemmaksi 6. if x.p == NIL 7. T.root = y 8. else if x == x.p.left 9. x.p.left = y 10. else 11. x.p.right = y 12. y.left = x // x y:n vasemmaksi lapseksi 13. x.p = y 14. return Oikea rotaatio on symmetrinen Syöte: Binäärinen etsintäpuu T ja solmu x, jonka suhteen kierretään. Oletus: x.left!= NIL Tulostus: Suorittaa puussa oikean rotaation solmun x suhteen RBT_OIKEA_ROTAATIO(T,x) 1. y = x.left 2. x.left = y.right // y:n oikea alipuu x:n vasemmaksi alipuuksi 3. if y.right!= NIL 4. y.right.p = x 5. y.p = x.p // x:n vanhempi y:n vanhemmaksi 6. if x.p == NIL 7. T.root = y 8. else if x == x.p.right 9. x.p.right = y 10. else 11. x.p.left = y 12. y.right = x // x y:n oikeaksi lapseksi 13. x.p = y 14. return Rotaatiot ovat vakioaikaisia, koska niissä tehdään vakiomäärä osoittimien sijoituksia.

5 Perehdytään seuraavaksi siihen, miten puna-mustaan puuhun voidaan lisätä avain niin, että puu säilyy puna-mustana ja siten tasapainossa. Algoritmi lisää ensin avaimen kuten binääriseen etsintäpuuhun, mutta lisäämisen jälkeen kutsutaan vielä rutiinia, joka korjaa puun: Syöte: Puna-musta puu T ja solmu z, jonka avain on lisättävä avain. Tulostus: Lisää avaimen z.key puuhun niin, että T säilyy puna-mustana. RBT_LISÄÄ(T,z) 1. y = NIL 2. x = T.root 3. while x!= NIL 4. y = x 5. if z.key < x.key 6. x = x.left 7. else 8. x = x.right 9. z.p = y 10. if y == NIL 11. T.root = z 12. else if z.key < y.key 13. y.left = z 14. else 15. y.right = z 16. z.left = NIL 17. z.right = NIL 18. z.color = RED 19. RBT_LISÄYS_KORJAUS(T,z)

6 Huomaa, että lisättävä solmu väritetään punaiseksi. Solmun lisääminen voi luonnollisesti rikkoa puun puna-mustaominaisuuden, joten tarvitaan korjausrutiini: Syöte: Puu T ja solmu z, joka on lisätty T:hen. T on ollut puna-musta puu ennen z:n lisäystä. Tulostus: Korjaa T:n puna-mustaksi. RBT_LISÄYS_KORJAUS(T,z) 1. while z.p.color == RED 2. if z.p == z.p.p.left 3. L_KORJAA_VASEN(T,z) 4. else 5. L_KORJAA_OIKEA(T,z) 6. T.root.color = BLACK L_KORJAA_VASEN(T,z) 1. y = z.p.p.right 2. if y.color == RED 3. z.p.color = BLACK // tapaus 1 4. y.color = BLACK // tapaus 1 5. z.p.p.color = RED // tapaus 1 6. z = z.p.p // tapaus 1 7. else 8. if z == z.p.right 9. z = z.p // tapaus RBT_VASEN_ROTAATIO(T,z) // tapaus z.p.color = BLACK // tapaus z.p.p.color = RED // tapaus RBT_OIKEA_ROTAATIO(T, z.p.p) // tapaus 3 L_KORJAA_OIKEA(T,z) 1. y = z.p.p.left 2. if y.color == RED 3. z.p.color = BLACK // tapaus 1* 4. y.color = BLACK // tapaus 1* 5. z.p.p.color = RED // tapaus 1* 6. z = z.p.p // tapaus 1* 7. else 8. if z == z.p.left 9. z = z.p // tapaus 2* 10. RBT_OIKEA_ROTAATIO(T,z) // tapaus 2* 11. z.p.color = BLACK // tapaus 3* 12. z.p.p.color = RED // tapaus 3* 13. RBT_VASEN_ROTAATIO(T, z.p.p) // tapaus 3* Perustellaan seuraavaksi, miksi T korjaantuu edellä määritellyillä operaatioilla puna-mustaksi puuksi. Perustelu ei ole erityisen tarkka: yksityiskohtaisempaa käsittelyä kaipaava voi perehtyä kirjan [Cor] esitykseen. Tutkitaan ensin, mitkä puna-mustan puun ominaisuudet voivat rikkoutua solmua lisättäessä. Palautetaan mieleen, että lisättävä solmu on aina punainen. Kun solmu lisätään puuhun, ominaisuudet 1 ja 3 säilyvät, koska puuhun lisätään punainen solmu, jolla on kaksi mustaa (tyhjää) lehtisolmua. Lisättävä punainen solmu sijoitetaan mustan lehtisolmun tilalle, joten ominaisuus 5 pysyy myös voimassa. Jos punainen solmu lisätään juureksi, voi

7 ominaisuus 2 rikkoutua. Mikäli lisättävä punainen solmu sattuu punaisen solmun lapsisolmuksi, voi myös ominaisuus 4 lakata pätemästä. Perehdytään nyt algoritmiin. Todetaan aluksi, että jos solmu lisätään tyhjään puuhun (jolloin se menee juureen) ei korjauksessa tehdä muuta kuin juuren muuttaminen mustaksi. Tällöin puusta tulee hyvin muodostettu puna-musta puu. Oletetaan jatkossa, että solmua ei lisätä juureen. Tällöin juuri on musta, joten jos solmu lisätään juuren lapseksi, saadaan puna-musta puu ilman korjauksia. Näin ollen voidaan olettaa, että solmulla on alussa isovanhempi. Edelleen havaitaan, että while-silmukan jokaisen kierroksen alussa solmu z on punainen ja silmukkaa jatketaan vain jos solmun z vanhempi on punainen. Siten vanhempi ei ole juuri ja solmulla z on puussa isovanhempi. Lisäksi solmu z nousee puussa kohti juurta jokaisella kierroksella, joten algoritmi päättyy. Mikäli solmu nousee juureen asti, puun juuri on silmukan päättyessä punainen. Tämä korjataan algoritmin RBT_LISÄYS_KORJAUS rivillä 6, joten algoritmin päättyessä joka tapauksessa puun juuri on musta. Näin ollen ainoa puna-mustan puun ominaisuus, joka ei ehkä ole algoritmin päättyessä voimassa on ominaisuus 4. Kun solmu lisätään, ainoa vika puussa voi olla, että lisätyn solmun z vanhempi on punainen. Tutkitaan nyt mitä algoritmissa tapahtuu tällöin. Koska algoritmit L_KORJAA_VASEN ja L_KORJAA_OIKEA ovat toistensa peilikuvat, riittää tarkastella toista. Oletetaan siis, että solmun z vanhempi on oman vanhempansa vasemmassa alipuussa ja mennään suorittamaan algoritmia L_KORJAA_VASEN. Tarkastelu jakaantuu nyt kolmeen tapaukseen: 1. Solmu y on punainen. Tällöin solmun z vanhempi ja solmu y väritetään mustiksi ja solmun z isovanhempi punaiseksi. Solmu z nousee kaksi askelta puussa. Seuraava kuva havainnollistaa tilannetta. Operaation jälkeen ainoa mahdollinen vika muodostuneessa puussa on uuden z:n vanhemman punaisuus. Mikäli näin on, jatketaan silmukkaa y z y z 12

8 2. Solmu y on musta ja z on oikea lapsi. Tällöin tehdään seuraavan kuvan mukainen vasen rotaatio, y y 8 16 z 28 z joka vie tilanteen tapaukseen 3. Solmu y on musta ja z on vasen lapsi. Tällöin väritetään solmun z vanhempi mustaksi ja isovanhempi punaiseksi. Lisäksi tehdään oikea rotaatio solmun z isovanhemman suhteen seuraavan kuvan mukaisesti. Operaation jälkeen solmun z vanhempi on musta ja silmukka päättyy y z z Edellisestä tarkastelusta huomataan, että while-silmukkaa suoritettaessa ominaisuus 4 voi rikkoutua vain yhdessä kohdassa, kun z ja sen vanhempi on punainen. Silmukan päättyessä solmun z vanhempi on musta, joten silmukan päättyessä ominaisuus 4 on puussa voimassa. Koska juuri väritetään lopulta mustaksi, saadaan algoritmin päättyessä puna-musta puu. Selvitetään vielä lisäysalgoritmin aikakompleksisuus. Lisäyksen operaatioiden lukumäärä ennen korjausta on, kuten binäärisillä etsintäpuillakin, luokkaa O(h), missä h on puun korkeus. Puussahan edetään syvemmälle, kunnes kohdataan lehti, johon solmu voidaan lisätä. Rotaatiot

9 ovat vakioaikaisia, koska niissä tehdään vakiomäärä osoittimien sijoituksia. Näin ollen korjauksen aikakompleksisuus riippuu siitä, kuinka monta kertaa while-silmukkaa suoritetaan. Korjattava solmu nousee puussa jokaisella silmukan kierroksella ylöspäin, joten myös korjauksen aikakompleksisuus luokkaa O(h). Näin ollen koko lisäysoperaation aikakompleksisuus on luokkaa O(h). Puun korkeuden osoitettiin aiemmin olevan suuruusluokkaa lg(n), kun n on puun solmujen lukumäärä. Puna-mustaan puuhun lisäyksen aikakompleksisuus on siten kaikkiaan luokkaa O(lg(n)), missä n on puun solmujen lukumäärä. Perehdytään vielä solmun poistamiseen puna-mustasta puusta. Aluksi tarvitaan apualgoritmi, joka siirtää puussa alipuun toisen alipuun paikalle: Syöte: Puna-musta puu T ja sen solmu u sekä solmu v. Tulostus: Poistaa puusta u:n ja siitä lähtevän alipuun ja korvaa tämän solmulla v ja siitä lähtevällä alipuulla. RBT_TRANSPLANT(T,u,v) 1. if u.p == NIL 2. T.root = v 3. else 4. if u == u.p.left 5. u.p.left = v 6. else 7. u.p.right = v 8. v.p = u.p

10 Puna-mustasta puusta poistaminen muistuttaa binäärisestä etsintäpuusta poistamista, mutta nyt pitää luonnollisesti huolehtia myös puna-mustaominaisuuksien säilymisestä. Syöte: Puna-musta puu T ja sen solmu z. Tulostus: Poistaa puusta solmun z niin, että jäljelle jää puna-musta puu. RBT_POISTA(T,z) 1. y = z 2. y_orig_color = y.color 3. if z.left == NIL 4. x = z.right 5. RBT_TRANSPLANT(T,z,z.right) 6. else 7. if z.right == NIL 8. x = z.left 9. RBT_TRANSPLANT(T,z,z.left) 10. else 11. y = BST_MINIMI(z.right) 12. y_orig_color = y.color 13. x = y.right 14. if y.p == z 15. x.p = y 16. else 17. RBT_TRANSPLANT(T,y, y.right) 18. y.right = z.right 19. y.right.p = y 20. RBT_TRANSPLANT(T,z,y) 21. y.left = z.left 22. y.left.p = y 23. y.color = z.color 24. if y_orig_color == BLACK 25. RBT_POISTO_KORJAUS(T,x) Algoritmi tuhoaa solmun kuten binäärisestä etsintäpuusta, mutta puun kunnossa pitämiseksi joudutaan lisäämään hieman ominaisuuksia. Tarkastellaan ensin muuttujan y arvoa algoritmin päättyessä. Mikäli poistettavalla solmulla z ei ole kumpaakin alipuuta, y on poistettu solmu z. Jos taas solmulla z on kumpikin alipuu, y on algoritmin suorituksen loputtua solmu, joka tulee poistettavan solmun z paikalle. Tällöin solmu x puolestaan siirretään solmun y alkuperäiselle paikalle. Oletetaan, että solmun y alkuperäinen väri on punainen. Tarkastellaan aluksi ensimmäistä tapausta: y on poistettu solmu z. Poistettu solmu ei punaisena voinut olla juuri; siten puun juuri on algoritmin päättyessä edelleen musta. Punaisen solmun poistaminen ei myöskään voi aiheuttaa punaisen solmun lapsen muuttumista mustaksi eikä se vaikuta mustien solmujen lukumäärään poluissa lehtiin. Näin ollen puu säilyy puna-mustana eikä korjauksia tarvita. Siirrytään tapaukseen, jossa y tulee solmun z tilalle. Koska y saa värikseen poistettavan solmun värin, poisto ei vaikuta mustien solmujen lukumääriin poluissa. Jos y oli solmun z oikea lapsi, y korvaa solmun z ja mikään puna-mustan puun ominaisuus ei rikkoudu. Jos y ei ollut solmun z oikea lapsi, solmun y oikea lapsi x korvaa solmun y. Koska y oli punainen, solmun x on oltava musta. Näin ollen operaatio ei aiheuta punaisten solmujen joutumista punaisten solmujen lapsiksi ja jälleen puu säilyy puna-mustana.

11 Solmun poistaminen voi vahingoittaa puna-mustaa puuta siis vain, jos solmun y alkuperäinen väri on musta. Tällöin saatetaan tarvita korjausoperaatio. Puu voi vahingoittua kolmella eri tavalla: 1. Solmu y oli alun perin juuri, joka poistettiin ja sen punaisesta lapsesta tuli uusi juuri. 2. Solmu x on punainen, samoin kuin solmun y vanhempi. Tällöin punaiselle solmulle tulee punainen lapsi. 3. Kun solmua y siirretään puussa, voi jokin polku, jolla y aiemmin oli, menettää yhden mustan solmun. Tällöin ei siis puna-mustan puun ominaisuus 5 säily voimassa. Kaikki nämä tapaukset voidaan käsitellä seuraavalla algoritmilla: Syöte: Puu T ja solmu x. Tulostus: Korjaa T:n puna-mustaksi. RBT_POISTO_KORJAUS(T,x) 1. while x!= T.root AND x.color == BLACK 2. if x == x.p.left 3. P_KORJAA _VASEN(T,x) 4. else 5. P_KORJAA_OIKEA(T,x) 6. x.color = BLACK P_KORJAA_VASEN(T,x) 1. w = x.p.right 2. if w.color == RED 3. w.color = BLACK // tapaus 1 4. x.p.color = RED // tapaus 1 5. RBT_VASEN_ROTAATIO(T, x.p) // tapaus 1 6. w = x.p.right // tapaus 1 7. if w.left.color == BLACK AND w.right.color == BLACK 8. w.color = RED // tapaus 2 9. x = x.p // tapaus else 11. if w.right.color == BLACK 12. w.left.color = BLACK // tapaus w:color = RED // tapaus RBT_OIKEA_ROTAATIO(T,w) // tapaus w = x.p.right // tapaus w.color = x.p.color // tapaus x.p.color = BLACK // tapaus w.right.color = BLACK // tapaus RBT_VASEN_ROTAATIO(T,x.p) // tapaus x = T.root // tapaus 4

12 P_KORJAA_OIKEA(T,x) 1. w = x.p.left 2. if w.color == RED 3. w.color = BLACK // tapaus 1* 4. x.p.color = RED // tapaus 1* 5. RBT_OIKEA_ROTAATIO(T, x.p) // tapaus 1* 6. w = x.p.left // tapaus 1* 7. if w.right.color == BLACK AND w.left.color == BLACK 8. w.color = RED // tapaus 2* 9. x = x.p // tapaus 2* 10. else 11. if w.left.color == BLACK 12. w.right.color = BLACK // tapaus 3* 13. w:color = RED // tapaus 3* 14. RBT_VASEN_ROTAATIO(T,w) // tapaus 3* 15. w = x.p.left // tapaus 3* 16. w.color = x.p.color // tapaus 4* 17. x.p.color = BLACK // tapaus 4* 18. w.left.color = BLACK // tapaus 4* 19. RBT_OIKEA_ROTAATIO(T,x.p) // tapaus 4* 20. x = T.root // tapaus 4* Tutkitaan ensin, miten ominaisuus 5 korjautuu edellä mainitulla rutiinilla. Oletetaan, että alun perin mustaa solmua y on siirretty niin, että solmun y esi-isistä lähtevät polut menettävät yhden mustan solmun. Koska solmu x siirtyy solmun y paikalle, voidaan asia korjata seuraavalla tempulla: Jos x oli punainen, väritetään se sekä punaiseksi että mustaksi, ts. x on väriltään punainen mutta lasketaan se mustaksi polkuja tarkasteltaessa. Jos taas x oli musta, sanotaan sitä kaksinkertaisesti mustaksi ja lasketaan se kahtena mustana poluissa. Näin mustien solmujen määrä poluissa säilyy muuttumattomana. Tällöin luonnollisesti rikkoutuu puna-mustien puiden ensimmäinen ominaisuus, koska puussa on solmuja, jotka eivät ole punaisia eivätkä mustia. Korjausoperaation while-silmukan ajatuksena on siirtää poistossa muodostunutta ylimääräistä mustaa puussa ylöspäin, kunnes jokin seuraavista tapahtuu: 1. Solmu x on punainen ja musta, jolloin silmukka loppuu ja solmu x väritetään mustaksi. 2. Solmu x on juuri, jolloin ylimääräinen musta poistetaan. Huomioidaan ensin, että niin kauan kuin ollaan while-silmukan sisällä, solmu x on kaksinkertaisesti musta, koska siinä vaiheessa, kun x on punainen ja musta, silmukka lopetetaan ja x väritetään varsinaiselta väriltään mustaksi. Tarkastellaan ainoastaan vasemmanpuoleista korjausrutiinia, koska toinen rutiini on tämän peilikuva ja toimii vastaavasti. Esitettävissä kuvissa harmaa solmu voi olla väriltään joko musta tai punainen. Aluksi rutiinissa solmu w osoittaa solmun x sisareen, jonka suhteen tarkastelu voidaan jakaa neljään tapaukseen:

13 1. Solmu w on punainen. Tällöin menetellään seuraavan kuvan mukaisesti ja päädytään johonkin myöhemmistä tapauksista. B D x A D w B E p q C E x A w C t u r s t u p q r s 2. Solmu w on musta ja sen molemmat lapset ovat mustia. Tällöin puu muuntuu seuraavasti. B x B x A D w A D p q C E p q C E r s t u r s t u Mikäli solmu B on punainen, silmukka päättyy ja B väritetään mustaksi. Jos B on musta, siitä tulee kaksinkertainen musta ja silmukkaa jatketaan. Tällöin kaksinkertainen musta on siirtynyt puussa ylöspäin. Huomaa, että tämä on ainoa tapaus, jossa while-silmukka voi jatkua. 3. Jos solmun w oikea lapsi on musta ja vasen punainen, muutetaan solmu w punaiseksi ja lapsi mustaksi sekä tehdään oikea rotaatio, kuten seuraavassa kuvassa, B B x A D w x A C w p q C E p q r D r s t u s E t u jolloin päädytään tapaukseen

14 4. Solmun w oikea lapsi on punainen. Seuraava kuva osoittaa, miten solmun x ylimääräinen musta poistuu ja silmukka lopetetaan. Huomaa, että solmu D väritetään samanväriseksi kuin B on vasemmalla, olipa se punainen tai musta. B D x A D w B E p q C E x A C t u r s t u p q r s x = T.root Korjausrutiinien jälkeen puun juuri säilyy mustana ja kaikkiin polkuihin jokaisesta solmusta lehtiin sisältyy yhtä monta mustaa solmua. Näin ollen puu säilyy puna-mustana. Edellä oleva tarkastelu on jokseenkin pintapuolinen; kiinnostunut lukija voi löytää yksityiskohtaisemman perustelun kirjasta [Cor].

15 8.2 Tietorakenteiden täydentäminen Usein tulee eteen tilanteita, joissa ongelman ratkaisuun riittää esitettyjen tietorakenteiden käyttö sellaisenaan. Usein kuitenkin tulee eteen myös tilanteita, joissa ne eivät ole riittäviä. Silloin on joko kehitettävä ratkaisuun soveltuva uusi tietorakenne (harvinaista) tai muokattava olemassaolevaa tietorakennetta lisätiedolla ja uusilla operaatioilla (yleistä). Ainoastaan harvoissa tapauksissa tarvitaan erillisen suunnitteluprosessin kautta täysin yksilöllinen tietorakenne. Olemassaolevan tietorakenteen täydentäminen on usein nopeampi ja vähemmän riskialtis prosessi. Tällaisen lisätiedon muokkaaminen rakenteeseen ei kuitenkaan välttämättä ole helppoa, sillä se voi vaatia muutoksia myös rakenteen alkuperäisiin operaatioihin. Tässä kappaleessa tarkastellaan kahta puna-mustiin puihin perustuvaa täydentämisesimerkkiä. Esimmäisessä esimerkissä puna-mustaa puuta täydennetään siten, että se tukee ns. järjestystunnuslukuihin perustuvia joukko-operaatioita, etenkin tietyn lukuarvon nopeaa löytämistä järjestetystä joukosta. Tämän jälkeen käydään läpi yleinen tietorakenteiden täydentämisen formalismi. Lisäksi esitetään tulos, joka suoraviivaistaa puna-mustien puiden täydentämistä. Lopuksi suunnitellaan puna-mustiin puihin perustuva tietorakenne erimittaisten intervallien (suljettu väli [t 1, t 2 ], t 2 t 1 ) tallentamiseen ja ylläpitämiseen. Määritelmä Olkoon A järjestämätön joukko, jossa on n alkiota. Joukon A i:s järjestystunnusluku (ith order statistic) on joukon A i:nneksi pienin alkio. Alkion x A järjestysluku (rank) on kyseisen alkion paikka A:n järjestetyssä joukossa A. Kuvassa on esimerkki järjestystunnusluvusta ja järjestysluvusta. Seuraavassa tarkastellaan järjestystunnuslukujen löytämistä järjestämättömästä joukosta. Mikä tahansa i:s järjestystunnusluku voidaan löytää ajassa O(n) käymällä koko joukko järjestelmällisesti läpi (osoita tämä). Seuraavassa kuitenkin täydennetään puna-mustaa puuta siten, että mille tahansa n alkiota sisältävälle dynaamiselle joukolle on mahdollista löytää i:s järjestystunnusluku ajassa O(lg n). Tällaista tietorakennetta kutsutaan järjestystunnuspuuksi (orderstatistic tree), jossa jokaiseen puna-mustan puun solmuun x on lisätty tieto x.size. Tämä tieto kertoo kyseisen solmun määrittämässä alipuussa (puu, jonka juuri solmu x on) sijaitsevien sisäsolmujen lukumäärän (mukaan lukien x itse). Asettamalla tyhjälle solmulle (solmu on N one) size = 0, jokainen ei-tyhjä solmu toteuttaa ehdon x.size = x.left.size + x.right.size + 1.

16 Kuva 8.2.1: Järjestystunnusluvut Kuvassa on esimerkki järjestystunnuspuusta, jossa solmun x ylempi arvo esittää avainta x.key ja alempi muuttujaa x.size. Seuraavassa määritellään Kuva 8.2.2: Esimerkki järjestystunnuspuusta kaksi järjestystunnuspuuta käsittelevää algoritmia Tietyn järjestysluvun omaavan alkion etsintä Algoritmi OS SELECT(x, i) palauttaa osoittimen solmuun, joka sisältää i:nneksi pienimmän luvun solmun x määrittämässä alipuussa. Tätä algoritmia käyttämällä voidaan siis löytää i:s järjestystunnusluku kutsumalla OS SELECT(T.root, i).

17 OS_SELECT (x, i) 1. r = x. left. size if i == r 3. return x 4. else if i < r 5. return OS_SELECT (x.left,i) 6. else 7. return OS_SELECT (x. right,i - r) Rivillä 1 lasketaan solmun x järjestysluku kyseisen solmun määrittämässä alipuussa. Arvo x.lef t.size on solmun x vasemman alipuun solmujen lukumäärä. Täten solmun x järjestysluku binäärisen etsintäpuun määritelmän nojalla on r = x.left.size + 1. Mikäli i = r, silloin i:s järjestysluku läytyy solmusta x ja se palautetaan rivillä 4. Mikäli i < r, on haettavan järjestysluvun läydyttävä vasemmasta alipuusta, jota siirrytään tarkastelemaan rivillä 6. Muussa tapauksessa siirrytään oikeaan alipuuhun, jonka juurena on x.right. Tälläin solmun x määrittämän alipuun i:nneksi pienin alkio on solmun x.right määrittämän alipuun (i r):nneksi pienin alkio. Esimerkki. Tarkastellaan kutsua OS SELECT(T.root, 9), missä T on kuvan puu. Merkitään x0 = T.root. Koska x0.left.size + 1 = 4 < 9, läytyy 9:nneksi pienin alkio x0:n oikeasta alipuusta. Olkoon x1 = x0.right (eli x1.key = 31, x1.size = 7). Haettu alkio on solmun x1 määrittämän alipuun 9 4 = 5:nneksi pienin alkio, koska x0:n määrittämässä puussa on yhteensä 4 kaikkia x1:n määrittämän alipuun alkioita pienempi alkioita. Kutsuna on tälläin OS SELECT(x0.right, 5). Nyt x1.left.size + 1 = 4 < 5, jolloin 5:nneksi pienin alkio läytyy jälleen oikeasta alipuusta kutsulla OS SELECT(x1.right, 5 4). Ks. kuva Olkoon x2 = x1.right. Tälläin x2.left.size + 1 = 2 > 1, jolloin haettu alkio läytyy vasemmasta alipuusta kutsulla OS SELECT(x2.left, 1). Olkoon x3 = x2.left. Koska x3:lla ei ole vasenta lapsisolmua, on x3.left.size = 0 ja rivin 3 ehto toteutuu. Siis x3 on haettu solmu. Ks. kuva Tarkastellaan seuraavaksi algoritmin OS SELECT aikakompleksisuutta. Koska pahimmassa tapauksessa jokaisella rekursiokutsulla siirrytään puussa syvemmälle kunnes ollaan lehtisolmussa, riippuu pahin tapaus puun korkeudesta. Koska kyseessä on puna-musta puu, on sen korkeus O(lg n), missä n on solmujen lukumäärä. Täten algoritmin OS SELECT aikakompleksisuus n:n alkion dynaamiselle joukolle on O(lg n) Alkion järjestysluvun määrittäminen Olkoon T järjestystunnuspuu ja x puun T solmu. Seuraavaksi määritellään algoritmi OS RANK(T, x), jolla voidaan määrittää solmun x järjestysluku.

18 Kuva 8.2.3: Esimerkki: OS SELECT Kuva 8.2.4: Esimerkki: OS SELECT OS_RANK (T, x) 1. r = x. left. size y = x 3. while y!= T. root 4. if y == y. parent. right 5. r = r + y. parent. left. size y = y. parent 7. return r Algoritmi toimii siten, että aluksi lasketaan solmun x järjestysluku puussa, jonka juuri x on. Tämän jälkeen siirrytään kohti puun T juurta. Mikäli tarkasteltu solmu y on vasen lapsisolmu, järjestyslukua ei tarvitse päivittää, sillä tällä askeleella ylöspäin ei läytynyt uusia solmuja, jotka ovat järjestyksessä edellä. Jos

19 solmu y on oikea lapsi, järjestyslukua kasvatetaan sisarsolmun (y.parent.lef t) määrittämän alipuun koolla (+ y:n vanhemmalla). Seuraavan silmukkainvariantin avulla voidaan osoittaa algoritmin oikeellisuus: Silmukkainvariantti: Jokaisen while-silmukan alussa muuttuja r sisältää annetun solmun x järjestysluvun siinä alipuussa, jonka juuri on solmu y. Tämä silmukkainvariantti on voimassa algoritmille OS RANK seuraavan perustelun nojalla: Alustus: Suorituksen alussa asetetaan r solmun x järjestysluvuksi siinä puussa, jonka juuri on x. Koska rivillä 3 asetetaan y = x, niin silmukkainvariantti on voimassa. Ylläpito: Tarkastellaan while-silmukan yhtä iterointikertaa. Lopussa (rivi 7) asetetaan y = y.parent. On osoitettava, että mikäli alussa (rivi 5) r on solmun x järjestysluku alipuussa, jonka juuri on y, niin lopussa (rivi 7) r on solmun x järjestysluku alipuussa, jonka juuri on y.parent. Tarkastellaan puuta, jonka juuri on y.parent. Aiemmin on jo laskettu solmun y määrittämän alipuun kattava järjestysluku. Täytyy siis huolehtia että uuden juurisolmun (y.parent) molemmat alipuut tulevat käsiteltyä. Jos y on uuden juuren vasen lapsi, niin uuden juuren oikea alipuu voidaan jättää käsittelemättä, koska y.parent eikä yksikään solmun y.parent oikeassa alipuussa oleva solmu voi sisältää y:tä pienempää arvoa. Muussa tapauksessa y on uuden juuren oikea lapsi (y == y.parent.right). Muuttujaa r päivitetään uuden juuren vasemman alipuun koon mukaisesti (r = r+y.parent.left.size+1), koska kaikki nämä arvot ja y.parent ovat solmun y arvoa pienempiä. Tämä varmistaa, että silmukan lopussa (rivi 7) r on solmun x järjestysluku alipuussa, jonka juuri on y.parent. Lopetus: While-silmukasta poistutaan kun järjestystunnuspuun juuri on sijoitettu muuttujaan y. Tälläin r sisältää solmun x järjestysluvun koko järjestystunnuspuun osalta. Jokainen while-silmukan iteraatio suoritetaan ajassa O(1). Lisäksi puussa siirrytään joka iteraatiolla taso yläspäin kohti juurta. Täten algoritmin OS RANK pahimman tapauksen suoritusaika on O(lg n), missä n on solmujen lukumäärä. Esimerkki. Tarkastellaan esimerkkinä kutsua OS RANK(T, x), missä T ja x ovat esitettynä kuvassa Koska x:llä ei ole lapsisolmuja, asetetaan r = 1.

20 Merkitään y0 = x. Koska y0 ei ole puun juuri, siirrytään while-silmukkaan. Tässä tilanteessa y0 ei ole vanhempansa oikea lapsi, joten r:n arvoa ei tarvitse muuttaa, vaan siirrytään puussa yläspäin solmuun y1 = y0.parent. Vieläkään ei olla juuressa T.root, jolloin while-silmukka jatkuu. Tälläkin kerralla y1 on vanhempansa vasen lapsi, joten r jätetään ennalleen ja siirrytään solmuun y2 = y1.parent. Nyt y2 on vanhempansa oikea lapsi, jolloin päivitetään r = r + y2.parent.left.size + 1 = 5 ja siirrytään solmuun y3 = y2.parent. Nyt on saavutettu juuri, jolloin while-silmukkaa ei jatketa, vaan palautetaan solmun x järjestysluku 5. Kuva 8.2.5: Esimerkki : OS RANK Sekä OS SELECT että OS RANK suoriutuvat tehokkaasti, koska solmut sisältävät lisämuuttujan size. Tämä kuitenkin vaatii, että x.size pysyy oikeellisena jokaiselle puun solmulle x, mikäli puuta muokataan. Tämä vaatii muutoksia puna-mustan puun operaatioihin. Kuten aiemmin on nähty, solmun lisäys puuhun koostuu kahdesta vaiheesta. Ensimmäisessä vaiheessa kuljetaan juuresta alaspäin ja etsitään solmun paikka puussa. Toisessa vaiheessa palataan juurta kohti vaihtaen solmujen väritystä ja tekemällä rotaatioita, jotta puna-mustan puun ehdot pysyvät voimassa. Muuttujan size päivitys voidaan näissä kahdessa vaiheessa taata seuraavasti. Ensimmäisessä vaiheessa kasvatetaan jokaisen solmun x muuttujaa x.size yhdellä, mikäli kyseinen solmu oli polulla kun lisättävän solmun z paikkaa etsittiin. Lisättävälle solmulle asetetaan z.size = 1. Koska polulla on korkeintaan O(lg n) solmua, kasvattaa tämä aikakompleksisuutta O(lg n) verran. Toisessa vaiheessa puun rakenteeseen vaikuttavat rotaatiot, joita voi olla maksimissaan kaksi kappaletta. Lisäksi rotaatiot voivat aiheuttaa ainoastaan

21 kahden solmun size-muuttujan muuttumisen virheelliseksi. Jotta tämä voidaan korjata, on algoritmin LEFT ROTATE loppuun lisättävä rivit: y. size = x. size x. size = x. left. size + x. right. size + 1 Symmetrinen lisäys on luonnollisesti tehtävä algoritmiin RIGHT ROTATE. Koska solmun lisäyksessä on tehtävä korkeintaan kaksi rotaatiota, sizemuuttujan päivittämiseen käytettävä lisäaika on O(1). Tälläin solmun lisäys järjestystunnuspuuhun on aikakompleksisuudeltaan O(lg n), mikä on asymptoottisesti samaa luokkaa normaalin puna-mustan puun kanssa. Solmun poistaminen puna-mustasta puusta tapahtuu myös kahdessa vaiheessa. Ensimmäisessä vaiheessa operoidaan alla olevaan etsintäpuuhun. Tälläin poistettu solmu mahdollisesti aiheuttaa toisten solmujen kulkeutumisen lähemmäs juurta. Jotta solmujen size-muuttujat pysyvät oikeina, on kuljettava poistetun solmun paikalta juureen ja vähennettävä polulla olevien solmujen sizemuuttujaa yhdellä. Koska polun pituus on O(lg n), tulee poisto-operaatioon lisätyätä ensimmäisessä vaiheessa O(lg n) verran. Toisessa vaiheessa puun rakenne korjataan korkeintaan kolmella rotaatiolla. Kuten lisäyksessä, rotaatioiden aiheuttama lisäaika on O(1), jolloin poiston kokonaiskompleksisuudeksi saadaan n:n solmun järjestystunnuspuulle O(lg n) Tietorakenteiden täydentämisen formalismi Algoritmien suunnittelussa joudutaan usein täydentämään perustietorakenteita juuri kuvatulla tavalla. Kuten nähtiin, tietorakenteiden täydentäminen koostuu seuraavasta neljästä pääkohdasta: 1. Alla olevan tietorakenteen valinta. 2. Täydentämisen kautta lisättävän informaation tarkka määrittely. 3. Uuden informaation oikean käsittelyn verifiointi (tietorakenteen perusoperaatioille). 4. Uusien operaatioiden kehittäminen. Tätä listausta ei yleensä suoriteta numerojärjestyksessä itse täydennysprosessin aikana, mutta se toimii korkean tason jaotteluna täydentämiseen liittyvässä työssä, ja etenkin tehdyn työn dokumentoinnissa. Nämä kohdat käytiin läpi järjestystunnuspuun suunnittelussa seuraavasti:

22 1. Perusrakenne on puna-musta puu. 2. Täydentävä informaatio on size-muuttuja jokaisessa solmussa. 3. size-muuttujan ylläpito selvitettiin erikseen. 4. Uusina operaatioina esiteltiin OS SELECT ja OS RANK. Tarkastellaan vielä puna-mustan puun täydentämistä. Puna-mustille puille voidaan osoittaa hyödyllinen tulos, joka suoraviivaistaa kohtaa 3: Olkoon f jokin tietue, joka täydentää puna-mustaa puuta T. Olkoon T :ssä n solmua. Oletetaan, että jokaista solmua x kohti f riippuu ainoastaan solmuista x, x.lef t ja x.right (mukaanlukien x.lef t.f ja x.right.f). Tällöin tietuetta f voidaan ylläpitää jokaisessa puun T solmussa x puuta koskevien lisäys- ja poisto-operaatioiden aikana ilman, että suorituskykyraja O(lg n) rikkoutuu. Todistus tälle tulokselle läytyy viitteestä [1] Intervallipuut Seuraavassa täydennetään puna-mustia puita tukemaan tietorakenneoperaatioita, jotka käsittelevät dynaamista joukkoa suljettuja intervalleja [t 1, t 2 ] = {t R t 1 t t 2 }. Tällainen tietorakenne on hyödyllinen, kun esimerkiksi mallinnetaan joukkoa tapahtumia, joilla on äärellinen ajallinen kesto. Intervalli [t 1, t 2 ] voidaan esittää alkiona i, joka sisältää muuttujat i.low = t 1 (alkupiste) sekä i.high = t 2 (loppupiste). Intervallit i ja i toteuttavat nk. intervallitrikotomia -ehdon (ks. kuva 8.2.6) eli täsmälleen yksi seuraavista ehdoista on tosi: (a) i i, eli intervallit limittyvät, (b) i on intervallin i vasemmalla puolella (i.high < i.low), (c) i on intervallin i oikealla puolella (i.high < i.low). Intervallipuu T on puna-musta puu, joka ylläpitää dynaamista joukkoa jossa jokainen alkio x sisältää intervallin x.int. Tuettuna ovat seuraavat operaatiot: INTERVAL INSERT(T, x): Lisää intervallin sisältävän alkion x intervallipuuhun T. INTERVAL DELETE(T, x): Poistaa alkion x intervallipuusta T.

23 Kuva 8.2.6: Intervallien trikotomia INTERVAL SEARCH(T, i): Palauttaa osoittimen alkioon x intervallipuussa T, missä x.int limittyy intervallin i kanssa, tai None muutoin. Seuraavaksi tarkastellaan, miten intervallipuun muodostus etenee edellä esitettyjen neljän täydennysperiaatteen mukaisesti. 1. Alla olevan tietorakenteen valinta: Valitaan puna-musta puu, jossa jokainen alkio x sisältää intervallin x.int ja alkion avain on x.int.low. Toisin sanottuna, intervallipuu listaa alkiot vastaavien intervallien alarajojen mukaiseen järjestykseen. 2. Täydentämisen kautta lisättävän informaation tarkka määrittely: Itse intervallien lisäksi jokainen alkio x sisältää myös arvon x.max, joka ilmaisee alkion x määrittämän alipuun sisältämien intervallien loppupisteiden maksimiarvon. 3. Uuden informaation oikean käsittelyn verifiointi: Osoitetaan, että intervallien lisäys- ja poisto-operaatiot n alkiota sisältävälle intervallipuulle voidaan edelleen suorittaa ajassa O(lg n). Muuttuja x.max voidaan määrittää intervallista x.int ja solmun x lapsisolmujen max-muuttujista: x.max = max{x.int.high, x.lef t.max, x.right.max}. Koska x.max riippuu ainoastaan solmuista x, x.lef t ja x.right, niin kappaleessa esitetyn tuloksen nojalla lisäys ja poisto voidaan suorittaa ajassa O(lg n). 4. Uusien operaatioiden kehittäminen: Täydennetylle tietorakenteelle esitellään yksi uusi operaatio: INTERVAL SEARCH:

24 INTERVAL_SEARCH (T, i) 1. x = T. root 2. while x!= None and 3. " i ei limitt ä ydy intervallin x. int kanssa " 4. if x. left!= None and x. left. max >= i. low 5. x = x. left 6. else 7. x = x. right 8. return x Tarkastellaan tämän algoritmin kompleksisuutta. Intervallin haku aloitetaan juuresta T.root ja se etenee askel kerrallaan puussa alaspäin. Haku loppuu mikäli läydetään limittäytyvä intervalli x.int tai saavutetaan solmu, joka on N one. While-silmukan sisältö suoritetaan ajassa O(1). Koska n alkiota sisältävän puna-mustan puun korkeus on O(lg n), niin algoritmin aikakompleksisuus on tällöin O(lg n). Vielä on osoitettava algoritmin INTERVAL SEARCH oikeellisuus. Sitä ennen tarkastellaan esimerkkiä ko. algoritmin toiminnasta. Esimerkki. Tarkastellaan kutsua INTERVAL SEARCH(T, i), missä i = [5, 6] ja T on esitetty kuvassa Algoritmi aloittaa haun juuresta Kuva 8.2.7: Esimerkki: INTERVAL SEARCH x0 = T.root. Koska intervalli i = [5, 6] ei limittäydy intervallin x0.int = [16, 21] kanssa, niin siirrytään suorittamaan while-silmukan sisältää. Koska x0.left on olemassa ja x.left.max = 23 > i.low = 5, niin siirrytään vasempaan lapsisolmuun x1 = x0.lef t. Vieläkään i ei limittäydy intervallin x1.int = [8, 9] kanssa, jolloin while-silmukka jatkuu. Nyt x1.lef t.max =

25 8 > i.low = 5, ja siirrytään jälleen vasempaan lapsisolmuun x2 = x1.left. Nyt i x2.int = [5, 6] [5, 8] = [5, 6] ja intervallit limittyvät. Siis x2 on haettu solmu. Osoitetaan nyt algoritmin INTERVAL SEARCH oikeellisuus. Esimerkin perusteella voidaan päätellä seuraava silmukkainvariantti: Silmukkainvariantti: Jos intervallipuu T sisältää intervallin joka limittyy annetun intervallin i kanssa, se löytyy solmun x määrittämästä alipuusta. Tämän perusteella saadaan: Alustus: Ensimmäisellä rivillä asetetaan x = T.root, jolloin invariantti on voimassa. Ylläpito: Jokaisella while-silmukan iteraatiolla siirrytään joko vasempaan tai oikeaan alipuuhun. Mikäli siirrytään oikeaan alipuuhun, niin joko a) x.left == None. Tällöin sijoitus x = x.right säilyttää silmukkainvariantin. b) x.left None, mutta x.left.max < i.low. Tällöin intervallitrikotomian perusteella mikään vasemman alipuun intervalli ei limity intervallin i kanssa, ja sijoitus x = x.right säilyttää silmukkainvariantin. Mikäli siirrytään vasempaan alipuuhun, niin x.lef t.max i.low. Silmukkainvariantti pätee jos ja vain jos seuraava ehto on voimassa: Jos vasemmasta alipuusta ei löydy annetun intervallin kanssa limittyvää intervallia, niin sitä ei löydy koko puusta. Oletetaan, että vasemmasta alipuusta ei läydy limittyvää intervallia ja osoitetaan että tämä väite pitää. Muuttujan max määritelmän perusteella täytyy olla jokin intervalli i jolle i.high = x.left.max i.low. Koska oletuksen nojalla i ja i eivät limity, niin on oltava i.high < i.low. Koska lisäksi intervallipuu on avainnettu intervallien alkupisteiden perusteella, niin etsintäpuun ehdon nojalla jokaiselle solmun x oikeassa alipuussa olevalle intervallille i pätee i.high < i.low i.low, jolloin intervallitrikotomian nojalla i ja i eivät limity. Siis puussa ei ole i:n kanssa limittyvää intervallia ja väite on tosi. Täten sijoitus x = x.lef t säilyttää silmukkainvariantin.

26 Lopetus: Mikäli while-silmukasta poistutaan kun x = N one, niin solmun x määrittämät alipuut ovat tyhjiä eivätkä siis voi sisältää intervallin i kanssa limittyvää intervallia. Lisäksi tällöin while-silmukan limittymisehto ei täyttynyt kertaakaan, joten intervallipuu T ei sisällä intervallin i kanssa limittyvää intervallia. Tämän nojalla INTERVAL SEARCH toimii oikein.

27 Kirjallisuutta [1] Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C. Introduction to Algorithms, 2nd edition, The MIT Press [2] Stallings, W. Cryptography and Network Security, Fourth Edition, Prentice Hall [3] Weiss, M. A. Data structures and algorithm analysis in Java, Addison Wesley

811312A Tietorakenteet ja algoritmit IV Perustietorakenteet

811312A Tietorakenteet ja algoritmit IV Perustietorakenteet 811312A Tietorakenteet ja algoritmit 2016-2017 IV Perustietorakenteet Sisältö 1. Johdanto 2. Pinot, jonot ja listat 3. Hash-taulukot 4. Binääriset etsintäpuut 5. Puna-mustat puut 6. Tietorakenteiden täydentäminen

Lisätiedot

4. Perustietorakenteet

4. Perustietorakenteet 4. Perustietorakenteet Tässä osassa käsitellään erilaisia tietorakenteita, joita algoritmit käyttävät toimintansa perustana. Aluksi käydään läpi tietorakenteen abstrakti määritelmä. Tämän jälkeen käsitellään

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

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut 811312A Tietorakenteet ja algoritmit 2018-2019 V Hash-taulukot ja binääriset etsintäpuut Sisältö 1. Hash-taulukot 2. Binääriset etsintäpuut 811312A TRA, Hash-taulukot, binääripuut 2 V.1 Hash-taulukot Käytetään

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

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu 1312A Tietorakenteet ja algoritmit, 2018-2019, 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 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 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

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

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

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

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

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

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

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

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

5. Hash-taulut ja binääriset etsintäpuut

5. Hash-taulut ja binääriset etsintäpuut 5. Hash-taulut ja binääriset etsintäpuut Tässä osassa käsitellään tietorakenteista hash-taulukot ja binääriset etsintäpuut ja niiden perusalgoritmit. Teoksessa [Cor] käsitellään tässä esitettäviä asioita

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

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

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

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

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu 811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,

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

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

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

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

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

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

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n)) Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit 811312A Tietorakenteet ja algoritmit 2015-2016 V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit Sisältö 1. Johdanto 2. Leveyshaku 3. Syvyyshaku 4. Kruskalin algoritmi 5. Dijkstran algoritmi

Lisätiedot

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö Algoritmit 1 Luento 5 Ti 24.1.2017 Timo Männikkö Luento 5 Järjestetty lista Järjestetyn listan operaatiot Listan toteutus taulukolla Binäärihaku Binäärihaun vaativuus Algoritmit 1 Kevät 2017 Luento 5 Ti

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

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

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

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen) 58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe 12.9.2018 ratkaisuja (Jyrki Kivinen) 1. [10 pistettä] Iso-O-merkintä. (a) Pitääkö paikkansa, että n 3 + 5 = O(n 3 )? Ratkaisu: Pitää paikkansa.

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

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta 811312A Tietorakenteet ja algoritmit 2016-2017 Kertausta jälkiosasta IV Perustietorakenteet Pino, jono ja listat tunnettava Osattava soveltaa rakenteita algoritmeissa Osattava päätellä operaatioiden aikakompleksisuus

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

Tarkennamme geneeristä painamiskorotusalgoritmia

Tarkennamme geneeristä painamiskorotusalgoritmia Korotus-eteen-algoritmi (relabel-to-front) Tarkennamme geneeristä painamiskorotusalgoritmia kiinnittämällä tarkasti, missä järjestyksessä Push- ja Raise-operaatioita suoritetaan. Algoritmin peruskomponentiksi

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

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

811312A Tietorakenteet ja algoritmit II Perustietorakenteet 811312A Tietorakenteet ja algoritmit 2017-2018 II Perustietorakenteet Sisältö 1. Johdanto 2. Pino 3. Jono 4. Lista 811312A TRA, Perustietorakenteet 2 II.1. Johdanto Tietorakenne on tapa, jolla algoritmi

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

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

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

(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

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

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

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko, Tehtävä 1 : 1 a) Olkoon G heikosti yhtenäinen suunnattu verkko, jossa on yhteensä n solmua. Määritelmän nojalla verkko G S on yhtenäinen, jolloin verkoksi T voidaan valita jokin verkon G S virittävä alipuu.

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

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

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

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

2. Perustietorakenteet

2. Perustietorakenteet 2. Perustietorakenteet Tässä osassa käsitellään erilaisia perustietorakenteita, joita algoritmit käyttävät toimintansa perustana. Aluksi käydään läpi tietorakenteen abstrakti määritelmä. Tämän jälkeen

Lisätiedot

4 Tehokkuus ja algoritmien suunnittelu

4 Tehokkuus ja algoritmien suunnittelu TIE-20100 Tietorakenteet ja algoritmit 52 4 Tehokkuus ja algoritmien suunnittelu Tässä luvussa pohditaan tehokkuuden käsitettä ja esitellään kurssilla käytetty kertaluokkanotaatio, jolla kuvataan algoritmin

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

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

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto 811312A Tietorakenteet ja algoritmit 2015-2016 I Johdanto Sisältö 1. Algoritmeista ja tietorakenteista 2. Algoritmien analyysistä 811312A TRA, Johdanto 2 I.1. Algoritmeista ja tietorakenteista I.1.1. Algoritmien

Lisätiedot

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu 811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 3, Ratkaisu Harjoituksessa käsitellään algoritmien aikakompleksisuutta. Tehtävä 3.1 Kuvitteelliset algoritmit A ja B lajittelevat syötteenään

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

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

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

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

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

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari Tehtävä 9 : 1 Merkitään kirjaimella G tehtäväpaperin kuvan vasemmanpuoleista verkkoa sekä kirjaimella H tehtäväpaperin kuvan oikeanpuoleista verkkoa. Kuvan perusteella voidaan havaita, että verkko G on

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 2. Luento 10 To Timo Männikkö

Algoritmit 2. Luento 10 To Timo Männikkö Algoritmit 2 Luento 10 To 19.4.2018 Timo Männikkö Luento 10 Peruutusmenetelmä Osajoukon summa Verkon 3-väritys Pelipuut Pelipuun läpikäynti Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 2/34 Algoritmien

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

13 Lyhimmät painotetut polut

13 Lyhimmät painotetut polut TIE-20100 Tietorakenteet ja algoritmit 297 13 Lyhimmät painotetut polut BFS löytää lyhimmän polun lähtösolmusta graafin saavutettaviin solmuihin. Se ei kuitenkaan enää suoriudu tehtävästä, jos kaarien

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 20.3.2018 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2018 Luento 3 Ti 20.3.2018

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

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

9.3 Algoritmin valinta

9.3 Algoritmin valinta TIE-20100 Tietorakenteet ja algoritmit 218 9.3 Algoritmin valinta Merkittävin algoritmin valintaan vaikuttava tekijä on yleensä sen suorituskyky käyttötilanteessa. Muitakin perusteita kuitenkin on: toteutuksen

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

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

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

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

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen) 58131 Tietorakenteet Erilliskoe 11.11.2008, ratkaisuja (Jyrki Kivinen) 1. (a) Koska halutaan DELETEMAX mahdollisimman nopeaksi, käytetään järjestettyä linkitettyä listaa, jossa suurin alkio on listan kärjessä.

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 21.3.2017 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017

Lisätiedot

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Luento 13 Ma Timo Männikkö Algoritmit 1 Luento 13 Ma 26.2.2018 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin

Lisätiedot

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Demot Timo Männikkö Algoritmit 2 Demot 1 27.-28.3.2019 Timo Männikkö Tehtävä 1 (a) 4n 2 + n + 4 = O(n 2 ) c, n 0 > 0 : 0 4n 2 + n + 4 cn 2 n n 0 Vasen aina tosi Oikea tosi, jos (c 4)n 2 n 4 0, joten oltava c > 4 Kokeillaan

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

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

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2 Johdatus diskreettiin matematiikkaan Harjoitus 4, 7.10.2015 1. Olkoot c 0, c 1 R siten, että polynomilla r 2 c 1 r c 0 on kaksinkertainen juuri. Määritä rekursioyhtälön x n+2 = c 1 x n+1 + c 0 x n, n N,

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta 811312A Tietorakenteet ja algoritmit 2018-2019 Kertausta jälkiosasta V Hashtaulukot ja binääriset etsintäpuut Hashtaulukot Perusajatus tunnettava Tiedettävä mikä on tiivistefunktio Törmäysongelman hallinta:

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

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen Luento omatoimisen luennan tueksi algoritmiikan tutkimusseminaarissa 23.9.2002. 1 Sisältö Esitellään ongelmat Steiner-puu Kauppamatkustajan

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

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö Algoritmit 1 Demot 2 1.-2.2.2017 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: laskesumma(t, n) sum = t[0]; for (i = 1; i < n; i++) sum = sum + t[i]; return sum; Silmukka suoritetaan n 1 kertaa

Lisätiedot

isomeerejä yhteensä yhdeksän kappaletta.

isomeerejä yhteensä yhdeksän kappaletta. Tehtävä 2 : 1 Esitetään aluksi eräitä havaintoja. Jokaisella n Z + symbolilla H (n) merkitään kaikkien niiden verkkojen joukkoa, jotka vastaavat jotakin tehtävänannon ehtojen mukaista alkaanin hiiliketjua

Lisätiedot

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos: 8 Kanta Tässä luvussa tarkastellaan aliavaruuden virittäjävektoreita, jotka muodostavat lineaarisesti riippumattoman jonon. Merkintöjen helpottamiseksi oletetaan luvussa koko ajan, että W on vektoreiden

Lisätiedot

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I. Vaihto-ominaisuudella on seuraava intuition kannalta keskeinen seuraus: Olkoot A I ja B I samankokoisia riippumattomia joukkoja: A = B = m jollain m > 0. Olkoon vielä n = m A B, jolloin A B = B A = n.

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

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