TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Samankaltaiset tiedostot
58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

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

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

Algoritmit 2. Luento 2 To Timo Männikkö

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

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

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

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

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

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

Algoritmi on periaatteellisella tasolla seuraava:

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

4. Joukkojen käsittely

13 Lyhimmät painotetut polut

Tarkennamme geneeristä painamiskorotusalgoritmia

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

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

Algoritmit 1. Luento 6 Ke Timo Männikkö

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.

Pienin virittävä puu (minimum spanning tree)

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

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

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

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

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 1. Luento 7 Ti Timo Männikkö

Tietorakenteet, laskuharjoitus 6,

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

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

Binäärihaun vertailujärjestys

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, esimerkkivastauksia viikon 12 laskareihin

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 14 Ke Timo Männikkö

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

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

Algoritmit 2. Luento 5 Ti Timo Männikkö

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Algoritmit 1. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Algoritmit 2. Luento 4 Ke Timo Männikkö

Lyhin kahden solmun välinen polku

5. Keko. Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat:

10. Painotetut graafit

A TIETORAKENTEET JA ALGORITMIT

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

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

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 1. Luento 13 Ma Timo Männikkö

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

Algoritmit 1. Luento 12 Ti Timo Männikkö

Datatähti 2019 loppu

Johdatus graafiteoriaan

Algoritmit 2. Luento 6 Ke Timo Männikkö

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

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

Luku 8. Aluekyselyt. 8.1 Summataulukko

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

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

1 Puu, Keko ja Prioriteettijono

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

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

Algoritmit 2. Luento 4 To Timo Männikkö

Tietorakenteet, esimerkkivastauksia viikon 12 laskareihin

Kierros 4: Binäärihakupuut

Algoritmit 2. Luento 11 Ti Timo Männikkö

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

Verkon virittävät puut

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

Kokeessa saa olla mukana A4:n kokoinen kaksipuoleinen kynällä tehty, itse kirjoitettu lunttilappu

Algoritmit 2. Luento 6 To Timo Männikkö

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

CS-A1140 Tietorakenteet ja algoritmit

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

j(j 1) = n(n2 1) 3 + (k + 1)k = (k + 1)(k2 k + 3k) 3 = (k + 1)(k2 + 2k + 1 1)

Algoritmit 1. Luento 5 Ti Timo Männikkö

Tiraka, yhteenveto tenttiinlukua varten

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 14 To Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

v 8 v 9 v 5 C v 3 v 4

Algoritmit 1. Luento 10 Ke Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

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

Malliratkaisut Demot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Ratkaisu. Tulkitaan de Bruijnin jonon etsimiseksi aakkostossa S := {0, 1} sanapituudelle n = 4. Neljän pituisia sanoja on N = 2 n = 16 kpl.

10. Painotetut graafit

14. Luennon sisältö. Kuljetustehtävä. Verkkoteoria ja optimointi. esimerkki. verkkoteorian optimointitehtäviä verkon virittävä puu lyhimmät polut

Transkriptio:

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 listasta duplikaatit eli saman avaimen toistuvat esiintymät. Jos sama avain esiintyy useita kertoja, vain listassa ensimmäisenä oleva jätetään listaan ja muut poistetaan. Ratkaisu: PoistaDuplikaatit(L) p = L. nil. next while p L. nil % oletetaan rengaslista % poista alkion p. key duplikaatit listan loppuosasta q = p. next while q L. nil if q. key == p. key then % poista duplikaatti kohdasta q q. prev. next = q. next q. next. prev = q. prev q = q. next p = p. next (b) Mikä on tehtävän (a) ratkaisusi aikavaativuuden suuruusluokka? Miten voisit ratkaista ongelman nopeammin käyttämällä apuna kurssilla esitettyjä tietorakenteita? Ratkaisu: Pahimman tapauksen aikavaativuus on Θ(n ), missä n on listan pituus. Tämä seuraa siitä, että jos listassa ei ole lainkaan duplikaatteja, alkion numero i kohdalla joudutaan sisemmässä silmukassa käymään läpi koko listan loppu eli n i alkiota, ja yhteen alkioon menee vakioaika. Aikavaativuus seuraa havainnosta n n 1 (n i) = j = i=1 j=0 n(n 1) = Θ(n ). Tehokkaampi algotritmi saadaan pitämällä yllä esim. hajautustaulussa tai tasapainoisessa hakupuussa hakemistoa listasta löytyneistä avaimista. Jokaisen solmun p kohdalla jos avain p. key ei vielä ole hakemistossa, lisätään se sinne ja säästetään solmu p. Jos avain p. key on jo hakemistossa, poistetaan osoittimen p kohdalla oleva solmu. Tämä edellyttää vain yhden listan läpikäynnin, ja lista-alkiota kohti tehdään vakiomäärä hakemisto-operaatioita. Siis aikavaativuudeksi tulee hakupuulla O(n log n) pahimmassa tapauksessa ja hajautustaululla O(n) keskimäärin, kun tehdään normaalit oletukset hajautusfunktion toiminnasta.

. [1 pistettä] Syötteenä on annettu taulukko A[1.. n], jossa on n eri suurta luonnollista lukua, sekä luku k väliltä 1.. n. Tehtävänä on tulostaa taulukosta A sen k pienintä lukua. Anna tehtävälle kolme eri ratkaisualgoritmia, joiden pahimman tapauksen aikavaativuudet ovat (a) O(kn) Ratkaisu: Toistetaan k kertaa taulukon läpikäynti, jossa otetaan talteen pienin alkio ja korvataan se jollain arvolla, joka on varmasti suurempi kuin taulukon k. pienin arvo. Yksi läpikäynti vie ajan O(n), joten kokonaisaikavaativuus on O(kn). (b) O(n log n) Ratkaisu: Järjestetään taulukko esim. lomitusjärjestämisellä ajassa O(n log n) ja tulostetaan sen k ensimmäistä lukua ajassa O(k). Koska k n, aikavaativuus on O(n log n + k) = O(n log n). (c) O(n + k log n). Ratkaisu: Muodostetaan taulukon alkioista minimikeko proseduurilla Build- Heap, joka vie ajan O(n). Poimitaan k kertaa keon pienin alkio keosta operaatiolla HeapDelMin, joka vie ajan O(log n). Siis kokonaisaikavaativuus on O(n+k log n). Näistä asymptoottisista aikavaativuuksista O(n + k log n) on aina vähintään yhtä hyvä kuin O(n log n), koska k n ja n < n log n (kun n > 1). Jos k on vakio, niin O(kn) ja O(n + k log n) pelkistyvät kumpikin muotoon O(n), mutta jos k ei ole vakio, niin O(n + k log n) on aidosti parempi. Jos esim. k = log n, niin O(n + k log n) = O(n), mutta kohtien (a) ja (b) algoritmit antavat O(n log n). 3. [1 pistettä] (a) Mitä ehtoja binääripuun pitää täyttää, että se olisi binäärihakupuu? Entä mitä ehtoja binäärihakupuun pitää täyttää, että se olisi AVL-puu? Ratkaisu: Binäärihakupuussa jokaisella solmulla x kaikkien avainten vasemmassa alipuussa x. left pitää olla pienempiä kuin x. key, ja oikeassa alipuussa x. right suurempia kuin x. key. AVL-puussa jokaisella solmulla x alipuiden x. left ja x. right korkeuksien ero saa olla vain 1, 0 tai 1; tässä tyhjän alipuun korkeudeksi lasketaan 1.

(b) Anna esimerkki tilanteesta, jossa avaimen lisääminen AVL-puuhun rikkoo AVLehdon ja tilanne korjataan suorittamalla yksi kierto. Ratkaisu: Lisätään puuhun 4 1 6 avain 1, jolloin välituloksena syntyy 4 1 6 / 1 Solmu on epätasapainossa, koska vasemman alipuun korkeus on ja oikean 0. Koska epätasapaino syntyi lisäyksestä vasemman lapsen vasempaan alipuuhun, tehdään kierto oikealle: 4 / 1 6 1 (c) Anna esimerkki tilanteesta, jossa avaimen poistaminen AVL-puusta rikkoo AVLehdon ja tilanne korjataan suorittamalla kaksoiskierto. Ratkaisu: Poistetaan puusta 4 1 / 6 9 \ 7 avain 9, jolloin välituloksena syntyy 4 1 6 \ 7 Solmu on epätasapainossa. Koska epätasapaino aiheutuu liikasolmuista vasemman lapsen oikeassa alipuussa, tehdään vasen-oikea-kaksoiskierrolla: 3

6 6 1 => 4 / 4 7 7 1 / 4. [1 pistettä] (a) Mitä tarkoittaa verkon topologinen järjestys? Millaisilla verkoilla se on olemassa? Onko se yksikäsitteinen? Havainnollista asiaa esimerkillä. Ratkaisu: Topologinen järjestys tarkoittaa sellaista verkon solmujen järjestystä, jossa verkon jokaisen kaaren lähtösolmu on ennen päätesolmua. Topologinen järjestys on määritelty suunnatuille syklittömille verkoilla. Yleensä topologinen järjestys ei ole yksikäsitteinen. Jos esim. verkossa on solmut a, b, c ja d sekä kaaret (a, b), (a, c), (b, d) ja (c, d), niin sillä on kaksi topologista järjestystä: (a, b, c, d) ja (a, c, b, d). (b) Esitä tehokas algoritmi verkon topologisen järjestyksen löytämiseksi. Ratkaisu: Katso esim. kevään 01 luentomuistiinpanoja (topologinen järjestäminen sivulla 49 ja sen tarvitsema DFS-All sivulla 47; aikavaativuus sivulla 4). 5. [1 pistettä] Tässä tehtävässä ei tarvitse esittää varsinaista ratkaisualgoritmia, vaan esittää ratkaisun idea. (a) Oletetaan, että painotetussa verkossa ei ole negatiivisia painoja. Dijkstran algoritmilla voi etsiä verkosta kahden solmun välisen polun, jossa kaarten painojen summa on pienin. Entä jos tehtävänä on löytää polku, jossa kaarten painojen tulo on pienin? Mitä muutoksia Dijkstran algoritmiin vaaditaan tässä tapauksessa? Tarvitseeko verkosta tehdä joitain lisäoletuksia, että muokattu algoritmi varmasti toimii? Ratkaisu: Tehdään lisäoletus, että kaikkien kaarten painot ovat vähintään 1. Jos kaaren e paino voisi olla välillä 0 < w(e) < 1, niin kaaren e käyttäminen pienentäisi polun kokonaiskustannusta, aivan samoin kuin negatiivinen kaaripaino Dijkstran algoritmin normaalitapauksessa. Olkoon annettu painotettu verkko G = (V, E, w), missä w(e) on kaaren e paino. Muodostetaan verkko G = (V, E, w ), missä w (e) = log w(e). Siis solmujen ja kaarten joukot pidetään ennallaan, mutta painoista otetaan logaritmi. Huomaa, että oletuksen w(e) 1 takia w (e) 0. Lasketaan nyt haluttujen solmujen välille lyhin polku verkossa G tavalliseen tapaan Dijkstran algoritmilla. Tämä on samalla verkon G se polku, jonka kaaripainojen tulo on pienin. Aikavaativuus on selvästi sama kuin Dijkstran algoritmilla eli O(( V + E ) log V )). Algoritmin oikeellisuuden toteamiseksi merkitään polun p = (v 0, v 1,..., v k ) kus- 4

tannusta alkuperäisessä verkossa ja uudessa verkossa T (p) = k 1 i=0 w(v i, v i+1 ) k 1 S(p) = w (v i, v i+1 ). i=0 Koska w (e) = log w(e) ja log i a i = i log a i, nähdään, että S(p) = log T (p). Koska logaritmifunktio on aidosti kasvava, kahdelle polulle p 1 ja p pätee S(p 1 ) < S(p ) jos ja vain jos T (p 1 ) < T (p ). Siis lyhin polku verkon G normaalin pituusmitan S suhteen on sama polku kuin tulomitan mukaan paras polku verkossa G. (b) Rautatieverkosto on esitetty suuntaamattoma verkkona G = (V, E), jonka solmuina on kaikki rautatieliikennepaikat ja kaarina niiden väliset ratayhteydet. Kutakin ratayhteyttä (u, v) meneville kuljetuksille on asetettu maksimipaino w(u, v). Tehtävänä on määrittää suurin paino, jolle voidaan taata rautatiekuljetus minkä tahansa kahden liikennepaikan välillä. Esitä, miten ongelma voidaan ratkaista tehokkaasti olettaen tunnetuksi kurssilla esitetyt algoritmit. Mikä on ratkaisusi aikavaativuus? Perustele aikavaativuus. Ratkaisu: Muodostetaan verkolle G suurin virittävä puu (V, T ). Tämä voidaan tehdä esim. vaihtamalla kaikki kaaripainot vastaluvuikseen, suorittamalla Primin tai Kruskalin algoritmi ja vaihtamalla kaaripaino takaisin alkuperäisiksi. Sama lopputulos saadaan vaihtamalla Primin tai Kruskalin algoritmissa erisuuruusvertailut toisin päin. Haluttu suurin paino on nyt kaarijoukon T pienin kaaripaino. Aikavaativuus on selvästi sama kuin Primin tai Kruskalin algoritmilla eli O( E log V ). Perustellaan vielä ratkaisun toimivuus. Olkoon e = (u, v) kaarijoukon T pienipainoisin kaari. Mistä tahansa solmusta pääsee mihin tahansa solmuun puun kaaria pitkin, joten ainakaan ei tarvitse käyttää pienempiä painoja kuin w(e). Toisaalta solmusta u solmuun v ei voi päästä ilman, että ainakin yhden kaaren paino on korkeintaan w(e). Tehdään nimittäin vastaoletus, että jollain polulla p: u v kaikki painot ovat aidosti suurempia kuin w(e). Jaetaan puu (V, T ) kahteen osaan poistamalla kaari e, ja yhdistetään osat uudelleen käyttämällä jotain polun p kaarta. Tuloksena syntyy virittävä puu, jonka paino on suurempi kuin puun (V, T ) paino; ristiriita, koska (V, T ) oli suurin virittävä puu. 5