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

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

811312A Tietorakenteet ja algoritmit IV Perustietorakenteet

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

4. Perustietorakenteet

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

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 6 Ke Timo Männikkö

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

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.

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

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

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

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

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Tietorakenteet, laskuharjoitus 7, ratkaisuja

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

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

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Algoritmit 2. Demot Timo Männikkö

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

1.1 Tavallinen binäärihakupuu

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

Algoritmit 2. Luento 10 To Timo Männikkö

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

Ohjelmoinnin perusteet Y Python

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

Kysymyksiä koko kurssista?

Datatähti 2019 loppu

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

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

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

B + -puut. Kerttu Pollari-Malmi

14 Tasapainotetut puurakenteet

6. Sanakirjat. 6. luku 298

Algoritmit 1. Luento 12 Ti Timo Männikkö

Tieto- ja tallennusrakenteet

Datatähti 2000: alkukilpailun ohjelmointitehtävä

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

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Algoritmit 2. Luento 11 Ti Timo Männikkö

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

Ohjelmoinnin perusteet Y Python

Kuva 1: J+-puun rakenne [HXS09].

Luku 8. Aluekyselyt. 8.1 Summataulukko

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 9 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. joulukuuta 2015

Binäärihaun vertailujärjestys

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

Algoritmit 2. Luento 9 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 12 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Ohjelmoinnin perusteet Y Python

4. Joukkojen käsittely

Algoritmit 1. Luento 8 Ke Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

9.3 Algoritmin valinta

Tietorakenteet, laskuharjoitus 6,

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Ohjelmoinnin perusteet Y Python

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

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

2. Perustietorakenteet

Jäsennysaiheesta lisää Täydentäviä muistiinpanoja TIEA241 Automaatit ja kieliopit, syksy 2016

A TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin peruskurssien laaja oppimäärä

Transkriptio:

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, 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 Oletetaan, että binääriseen etsintäpuuhun on tallennettu kokonaislukuja väliltä 1..1000. Puusta etsitään lukua 3. Mitkä seuraavista hakujonoista eivät voi olla luvun 3 etsintäjonoja? Ohje: Tarkastele jokaisen solmun jälkeen lukuväliä, josta etsintää jatketaan. a) 925, 202, 911, 2, 912, 245, 3. b) 2, 3, 387, 219, 266, 382, 3, 278, 3. c) 935, 278, 347, 621, 2, 392, 358, 3. 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, 2, 912, 245, 3 saadaan välit: (-,925], [202, 925], [202,911], [2,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, 3 ja välit ovat: [2, ), [2, 3], [2,387], [219,387], [266,387], [266,382], [266,3], [278,3], 3 löytyi. Jono on mahdollinen etsintäjono. Kohdan c jonossa 935, 278, 347, 621, 2, 392, 358, 3 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 3 etsintäjonoja. Tehtävä 5.3 Lisää ensin alla olevasta binääriseen etsintäpuuhun avain ja poista tämän jälkeen avaimet, 35, ja 60 tässä järjestyksessä. Esitä ratkaisut kuvioilla ja perustele niitä algoritmeihin BST_POISTA ja BST_TRANSPLANT nojaten.

Ratkaisu. Avain lisätään aina lehtisolmuksi sopivaan paikkaan puussa, joten avaimen lisäämisen jälkeen puu on 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 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 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 paikalle (algoritmin rivit 14-16). Tuloksena on oikeanpuoleinen puu.

15 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

Tehtävä 5.4 Alle linkitetyssä tekstitiedostossa task5_4_nums.txt on tallennettuna 200 satunnaislukua väliltä [1,1000000]. Jokainen luku on tallennettu omalle rivilleen. Tehtävänä on lukea luvut sellaiseen tallennusrakenteeseen, että annetusta luvusta voidaan nopeasti todeta, onko se tiedostossa olevien lukujen joukossa. Testaa ohjelmaasi luvuilla 613695, 9064, 180551, 1511, 951585 ja 569127, joista kolme ensimmäistä eivät ole tiedostossa ja kolme viimeistä ovat. Valitse toinen alla olevista vaihtoehdoista: a) C-kielisessä ohjelmassa käytetään tallennusrakenteena hash-taulukkoa, jonka koko on 4. Hash-funktio saadaan käyttämällä jakomenetelmää ja törmäysten hallintaan käytetään lineaarista luotausta. Alle linkitetyssä tiedostossa task5_4_base.c on ohjelma, jota voi käyttää toteutuksessa pohjana. Jos aikaa vielä jää, niin voit testata vielä ohjelmasi suorituskykyä tuottamalla 100 000 satunnaislukua väliltä [1,1000 000] ja mittaamalla näiden hakemiseen kulunut aika. b) Python-kielisessä ohjelmassa käytetään tallennusrakenteena binääristä hakupuuta, jonka toteutus on tiedostossa bst.py. Funktio bst_insert lisää puuhun avaimen ja bst_search etsii avainta. Jos avainta ei löydy, paluuarvo on None. Voit aloittaa ohjelman laatimisen tiedostoon task5_4_base.py. Testaa vielä ohjelmasi suorituskykyä tuottamalla 100 000 satunnaislukua väliltä [1,1000 000] ja mittaamalla näiden hakemiseen kulunut aika. Ratkaisu. Alla olevissa tiedostoissa on toteutettu vaadittavat ohjelmat. C-kielisen ohjelman funktio insert_number palauttaa arvon 1, jos tallentaminen onnistuu (tai jos luku on jo tallennettu). Mikäli taulukko on täynnä, palautetaan arvo -1. Lukua taulukosta etsivä funktio search_number palauttaa luvun paikan taulukossa, mikäli luku on tallennettuna siihen. Jos luku ei ole taulukossa, niin palautetaan arvo -1. Huomaa, miten funktioissa on otettu huomioon lineaarisen luotauksen vaikutus. Kun testikoneella mitattiin 100 000 luvun hakemiseen kulunutta aikaa, saatiin tulokseksi 0.0090 sekuntia. Aikaa 100 000 000 luvun hakemiseen kului 8.18 sekuntia. Python-ohjelmassa on hyödynnetty valmista binäärisen hakupuun toteutusta. Pythonohjelmalta kului testikoneella 100 000 luvun etsimiseen puusta 0.71 sekuntia ja 1000 000 luvun etsimiseen meni 7.37 sekuntia.