811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Samankaltaiset tiedostot
811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

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

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

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

811312A Tietorakenteet ja algoritmit IV Perustietorakenteet

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

4. Perustietorakenteet

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Algoritmit 2. Demot Timo Männikkö

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

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

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

Algoritmit 2. Luento 2 To Timo Männikkö

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

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

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.

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

Algoritmit 2. Luento 6 Ke Timo Männikkö

Tietorakenteet, laskuharjoitus 7, ratkaisuja

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

Algoritmit 1. Luento 7 Ti Timo Männikkö

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

Datatähti 2019 loppu

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

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.

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Kysymyksiä koko kurssista?

1.1 Tavallinen binäärihakupuu

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

A TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin peruskurssi Y1

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

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

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

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

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 8 Ke Timo Männikkö

Datatähti 2000: alkukilpailun ohjelmointitehtävä

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

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 12 Ke Timo Männikkö

Ohjelmoinnin perusteet Y Python

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

58131 Tietorakenteet ja algoritmit (syksy 2015)

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

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Demot Timo Männikkö

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

Algoritmit 2. Luento 11 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Ohjelmoinnin perusteet Y Python

4. Joukkojen käsittely

Algoritmit 1. Demot Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tietorakenteet, laskuharjoitus 6,

2. Perustietorakenteet

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

Tietorakenteet (syksy 2013)

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

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

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

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

9.3 Algoritmin valinta

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Transkriptio:

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, jonka koko on 11, kun tiivistefunktio on f ( k) k(mod11) ja a) törmäykset hoidetaan ketjutuksella; b) käytetään lineaarista luotausta; c) g( k) 1 ( k(mod10)) ja käytetään kaksoishashausta funktioiden f ja g avulla. Ratkaisu. a) Lasketaan 10 mod 11 = 10, 22 mod 11 = 0, 31 mod 11 = 9, 4 mod 11 = 4, 15 mod 11 = 4, 28 mod 11 = 6, 17 mod 11 = 6 ja 59 mod 11 = 4. Siis lopuksi T[0] -> 22 T[4] -> 4 -> 15 -> 59 T[6] -> 28 -> 17 T[9] -> 31 T[10] -> 10 Muut taulukon paikat ovat tyhjiä. b) Kun käytetään lineaarista luotausta, h(k,i) = (f(k)+i)(mod 11). Aluksi siis lasketaan f(k), sitten f(k)+1, jne. Aluksi f(10) = 10, joten T[10]=10. Sitten f(22) = 0 ja T[0] =22. Edelleen f(31) = 9, joten T[9] = 31. Jatketaan: f(4) = 4, ja T[4] = 4. Sitten f(15) = 4, joten nyt lasketaan h(k,1) = 5, siis T[5] = 15. Edelleen f(28) = 6, joten T[6] = 28. Vielä f(17) = 6, joten lasketaan h(k,1) = 7. Siis T[7] = 17. Lopuksi f(59) = 4, ja lasketaan h(k,1)=5, h(k,2)=6,h(k,3)=7 ja h(k,4)=8. Siten T[8] = 59. Lopussa T= 0 1 2 3 4 5 6 7 8 9 10 22 4 15 28 17 59 31 10 c) Nyt h(k,i) = (f(k) + i*g(k))(mod 11), joten luvut 10,22,31 ja 4 sijoittuvat kuten ennenkin. Sen sijaan h(15,0) = 4, h(15,1) = 4+6=10, eivät sijoitu, h(15,2) = 4+12 = 5(mod 11). Siis T[5] = 15. Lisäksi T[6] = 28. Nyt h(17,0) = 6 ja h(17,1) = 6+8 = 3 (mod 11). Lopuksi h(59,0) = 4, h(59,1) = 4+10 = 3 (mod 11), h(59,2) = 4+20= 2 (mod 11) ja T[2] = 59. Lopussa T= 0 1 2 3 4 5 6 7 8 9 10 22 59 17 4 15 28 31 10

Tehtävä 5.2 Suuressa tekstitiedostossa on n sanaa ja on selvitettävä, mikä kahden peräkkäisen sanan muodostama pari (esimerkiksi Oulun yliopisto ) esiintyy tiedostossa useimmin ja kuinka monta kertaa. Suunnittele asian selvittävä algoritmi, joka toimii sekä ajan että tilan suhteen mahdollisimman tehokkaasti. Vihje: Hash-taulukoista voi olla hyötyä. Ratkaisu. Koska sanoja on n kappaletta, on peräkkäisiä sanapareja n-1 kappaletta. Näistä voi luonnollisesti osa olla samoja; sanapareja voi siis olla korkeintaan n-1 erilaista. Määritellään funktio, joka kuvaa sanaparin kokonaisluvuille 0,,n-1. Tällainen voidaan saada esimerkiksi laskemalla ensin sanojen kirjaimien ASCII-koodeista hyvin suuri kokonaisluku seuraavaan tapaan: Sanapari Ken oon muunnetaan isoiksi kirjaimiksi KEN OON, joiden ASCII-koodit ovat K=75, E=69, N=78, O=79, O=79, N=78. Lasketaan 75 + 69*256 + 78*256 2 + 79*256 3 + 79*256 4 + 78*256 5 = 861025312523. Sitten lasketaan jakojäännös luvun n suhteen ja saadaan arvo väliltä 0,...,n-1. Käytetään tätä hash-funktiona, jonka mukaan sanapari tallennetaan n-pituiseen taulukkoon, joka on indeksoitu luvuilla 0,..,n-1. Esimerkiksi, jos tiedostossa olisi 10000 sanaa, käytettäisiin 10000-paikkaista taulukkoa ja edellisen esimerkin sanapari tallennettaisiin paikkaan 2523. Törmäykset hoidetaan lineaarisella luotauksella. Sanaparin lisäksi tallennetaan indeksiluku, joka asetetaan ensimmäisellä kerralla luvuksi 1 ja kun seuraavan kerran kohdataan sama pari, ainoastaan kasvatetaan indeksilukua. Jos esimerkiksi tiedostossa esiintyvät ensin sanapari ken oon ja vielä myöhemmin sanaparit ken oon ja keno on, näitä vastaavat hashit ovat 2523. Näin ollen taulukko olisi nyt 0: 2523: ken oon 2 2524: keno on 1 : Samalla kun sanaparia käsitellään, päivitetään indeksilukujen maksimiarvoa ja paikkaa, jossa indeksi esiintyy. Näin saadaan useimmin esiintyvä sanapari selville käymällä tiedosto kerran läpi. Koska törmäykset ovat verrattain harvinaisia, hash-taulukkoon tallentaminen tapahtuu lähes vakioajassa ja algoritmi toimii jokseenkin lineaariaikaisesti sanojen lukumäärän n suhteen. Mikäli tiedosto olisi erittäin suuri, pitäisi käyttää pienempää taulukkoa, jolloin törmäyksien määrä kasvaa.

Tehtävä 5.3 Oletetaan, että binääriseen etsintäpuuhun on tallennettu kokonaislukuja väliltä 1..1000. Puusta etsitään lukua 363. Mitkä seuraavista hakujonoista eivät voi olla luvun 363 etsintäjonoja? Ohje: Tarkastele jokaisen solmun jälkeen lukuväliä, josta etsintää jatketaan. a) 925, 202, 911, 240, 912, 245, 363. b) 2, 3, 387, 219, 266, 382, 3, 278, 363. c) 935, 278, 347, 621, 2, 392, 358, 363. Ratkaisu. Etsintäjonossa lukuväli, josta etsittävää lukua haetaan, kaventuu koko ajan. Mikäli jonossa esiintyy luku, joka ei ole aiemman välin sisällä, kyseessä ei voi olla oikea etsintäjono. Kohdan a jonolle 925, 202, 911, 240, 912, 245, 363 saadaan välit: (-,925], [202, 925], [202,911], [240,911], 912 ei kuulu edelliseen väliin, joten kysymyksessä ei ole oikea etsintäjono. Kohdassa b jono on 2, 3, 387, 219, 266, 382, 3, 278, 363 ja välit ovat: [2, ), [2, 3], [2,387], [219,387], [266,387], [266,382], [266,3], [278,3], 363 löytyi. Jono on mahdollinen etsintäjono. Kohdan c jonossa 935, 278, 347, 621, 2, 392, 358, 363 välit ovat: (-,935], [278,935], [347,935], [347,621], 2 ei kuulu edelliseen väliin, joten kysymyksessä ei ole oikea etsintäjono. Siis: jonot a ja c eivät voi olla luvun 363 etsintäjonoja. Tehtävä 5.4 Lisää ensin alla olevasta binääriseen etsintäpuuhun avain 63 ja poista tämän jälkeen avaimet 29, 35, 75 ja 60 tässä järjestyksessä. Esitä ratkaisut kuvioilla ja perustele niitä algoritmeihin BST_POISTA ja BST_TRANSPLANT nojaten. 75 29 40 68 84

Ratkaisu. Avain lisätään aina lehtisolmuksi sopivaan paikkaan puussa, joten avaimen 63 lisäämisen jälkeen puu on 75 29 40 68 84 63 Algoritmi solmun poistamiseksi on seuraava: BST_POISTA(T,k) 1. x = BST_ETSI(T,k) 2. if x == NIL 3. return FALSE 4. if x.left == NIL 5. BST_TRANSPLANT(T,x,x.right) 6. else if x.right == NIL 7. BST_TRANSPLANT(T,x,x.left) 8. else 9. y = BST_MINIMI(x.right) 10. if y.p!= x 11. BST_TRANSPLANT(T,y,y.right) 12. y.right = x.right 13. y.right.p = y 14. BST_TRANSPLANT(T,x,y) 15. y.left = x.left 16. y.left.p = y 17. return TRUE Algoritmi BST_TRANSPLANT(T,u,v) siirtää solmusta v lähtevän alipuun solmusta u lähtevän alipuun tilalle ja BST_MINIMI(u) hakee solmusta u lähtevän alipuun pieniarvoisimman solmun. Avain 29 voidaan poistaa puun lehdestä suoraan (algoritmin rivi 5). Tämän jälkeen avaimen 35 solmulle jää ainoastaan yksi alipuu, joten avain poistetaan siirtämällä sen äitisolmun linkki osoittamaan poistettavan solmun lapsisolmuun (samoin algoritmin rivi 5). Tuloksena on alla olevan kuvan vasemmanpuoleinen puu. Tähän puuhun on merkitty seuraavaksi poistettavan avaimen 75 seuraaja (haetaan algoritmin rivillä 9). Ensin poistetaan seuraajasolmu, jolla ei ole vasenta alipuuta. Näin ollen se voidaan poistaa siirtämällä sen äitisolmun vasen osoitin seuraajasolmun oikeaan alipuuhun (algoritmin rivit 11-13). Lopuksi kopioidaan seuraajan avain poistettavan avaimen 75 paikalle (algoritmin rivit 14-16). Tuloksena on oikeanpuoleinen puu.

15 40 75 68 84 29 40 68 84 63 63 Avain 60 on jälleen solmussa, jolla on vain yksi alipuu, joten se voidaan poistaa äitisolmun linkkiä siirtämällä (algoritmin rivi 5) ja saadaan alla oleva puu 25 68 84 29 40 63 Tehtävä 5.5 Tehtävätiedoston alle on linkitetty binääristen etsintäpuiden perusoperaatiot toteuttavat C- ja Python-ohjelmat. Niihin on toteutettu iteratiiviset versiot luennoilla esitetyistä algoritmeista BST_ETSI, BST_MINIMI ja BST_MAKSIMI. Toteuta niistä rekursiiviset versiot. Ohjelmissa on myös tulostusfunktio, joka tulostaa puun sisäjärjestyksessä, jolloin avaimet tulostetaan suuruusjärjestyksessä. Kirjoita funktio, jonka tulostuksesta käy ilmi puun rakenne, esimerkiksi seuraavasti: Juuri Juuren vasen lapsi Juuren vasemman lapsen vasen lapsi --- Juuren oikea lapsi Juuren oikean lapsen vasen lapsi ---

Ratkaisu. Seuraavassa rekursiiviset versiot pseudokoodilla. Funktioille annetaan aluksi parametrina puun juuri. BST_SEARCH_REC(x,k) 1. if x == NIL 2. return NIL 3. if x.key ==k 4. return x // k löytyi 5. else if x.key < k 6. return BST_SEARCH_REC(x.right,k) // k oikealla 7. else 8. return BST_SEARCH_REC(x.left,k) // k vasemmalla BST_MIN_REC(x) 1. if x==nil 2. return NIL 3. if x.left!=nil 4. return BST_MIN_REC(x.left) 5. else 6. return x // Minimi löytyi BST_MAX_REC(x) 1. if x==nil 2. return NIL 3. if x.right!=nil 4. return BST_MAX_REC(x.right) 5. else 6. return x // Maksimi löytyi Tehtävässä kuvatussa muodossa puun tulostaminen voidaan tehdä niin, että lisätään tulostusfunktiolle parametri, joka kuvaa sisennyksen määrää. Tätä kasvatetaan joka kerran kun edetään puussa alemmas. Näin saataisiin algoritmi BST_PRINT_FORM_NODE(x,level) 1. if x==nil 2. return 3. indent = // yksi sisennys 4. for i = 1 to level 5. print indent 6. print x // Tulostetaan solmu 7. BST_PRINT_FORM_NODE(x.left,level+1) 8. BST_PRINT_FORM_NODE(x.right,level+1) BST_PRINT_FORM_TREE(T) 1. BST_PRINT_FORM_NODE(T.root,0) // Tulostetaan juuresta alkaen Nämä funktiot on toteutettu alla olevassa liitetiedostossa.