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. Pitää osoittaa, että joillain d ja n 0 pätee n 3 +5 dn 3, kun n n 0. Kun n 2, pätee n 3 8 > 5 ja siis n 3 + 5 < 5n 3. Voidaan siis valita d = 5 ja n 0 = 2. (b) Pitääkö paikkansa, että n = O(log 2 n)? Ratkaisu: Ei pidä paikkaansa. Tarkastellaan aluksi suhdetta n/ log 2 n, kun n = m k joillain m, k 1. Tällöin tunnettujen ominaisuuksien perusteella n log 2 n = mk/2 k log 2 m = mk/2 1 k m log 2 m mk/2 1. k Erityisesti valitsemalla k = ja n = m jollain m 1 nähdään, että ja siis n log 2 n m/2 1 = n1/ log 2 n n 1/ n. Tehdään nyt vastaoletus, että n = O(log 2 n) pätee. Siis joillain d > 0 ja n 0 1 pätee n d log 2 n, kun n n 0. Valitaan n = m, missä m = max { n 0, d }+1. Nyt n > n 0 ja n 1/ / > d. Soveltamalla edellä johdettua epäyhtälöä nähdään, että d log 2 n d n < n n 1/ vastoin oletusta; ristiriita. Pisteytys: Kummastakin kohdasta on voinut saada 5 pistettä. Tässä on nimenomaan haettu täsmällisiä todistuksia, joten intuitiivisista luonnehdinnoista ei ole saanut pisteitä. Kohdassa (b) on saanut vedota mihin tahansa yleisesti tunnettuihin logaritmifunktion ominaisuuksiin, kunhan se on tehty täsmällisesti; epämääräinen viittaaminen sen kasvunopeuteen ei kelpaa. 2. [8 pistettä] Pikajärjestäminen. Selitä, miten pikajärjestäminen toimii ja mikä sen aikavaativuus on pahimmassa tapauksessa ja keskimäärin. Sopiva pituus tekstille on korkeintaan 2 konseptisivua. Mitään todistuksia ei tarvitse esittää. Ratkaisu: Katso luentomateriaalia. Pisteytys: Tehtävä oli yleisesti osattu erittäin hyvin. Selkeistä yksittäisistä virheistä algoritmin kuvauksessa tai aikavaativuudessa on vähennetty pari pistettä.
3. [12 pistettä] Binääripuut ja hakupuut. (a) Esitä yksityiskohtaisena pseudokoodina algoritmi, joka tarkastaa, toteuttavatko syötteenä annetun puun avaimet binäärihakupuuehdon. Syötteenä annetun puun jokaisessa solmussa on kokonaislukuarvoinen avain, ja se on toteutettu samanlaisena linkitettynä rakenteena kuin binääripuut yleensäkin. Puun tasapainoisuuteen ei tarvitse kiinnittää huomiota. Algoritmin aikavaativuuden tulee olla lineaarinen puun kokoon nähden. Ratkaisu: Kirjoitetaan proseduuri onhakupuu(p, ala, yla), joka saa argumenttina osoittimen p puun solmuun ja kokonaislukuarvoiset ala- ja ylärajan. Proseduuri palauttaa true, jos solmusta p alkava alipuu toteuttaa hakupuuehdon ja sen avaimet ovat välillä [ala, yla]. Haluttu ongelma ratkaistaan kutsulla onhakupuu(t. root, ala, yla), missä ala ja yla ovat rajat avainten mahdolliselle arvoalueelle. onhakupuu(p, ala, yla) if p. key < ala or p. key > yla if not onhakupuu(p. left, ala, p. key 1) if not onhakupuu(p. right, p. key +1, yla) return true Pisteytys: Maksimi (a)-kohdasta oli 6 pistettä. Tyypillinen virhe oli, että hakupuuehdon tarkastamisessa verrattiin solmua vain sen lapsiin eikä otettu huomioon, että myös esim. solmun x vasemman lapsen kaikissa jälkeläissä pitää olla pienempi avain kuin x:ssä. Tällainen algoritmi siis virheellisesti hyväksyy esim. puun 6 / 5 \ 8 Tällaisesta ratkaisusta, jos se on muuten selkeästi esitetty ja osoittaa binääripuiden rakenteen hallintaa, on saanut pistettä. (b) Selitä, miten tasapainottamattoman binäärihakupuun poisto-operaatio (Delete) toimii. Yksityiskohtaista pseudokoodia ei tarvitse esittää, voit esittää algoritmin toimintaperiaatteen kuvien ja esimerkkien avulla. Selityksestä pitää kuitenkin käydä ilmi tärkeimmät erilaiset tapaukset ja niiden käsittely. Myös mahdolliset apuproseduurit pitää selittää samalla tarkkuustasolla. Ratkaisu: katso luentomateriaalia. Pisteytys: Maksimi (b)-kohdasta oli 6 pistettä. Kun tehtävänannossa pyydettiin selittämään mahdolliset apuproseduurit, tällä tarkoitettiin erityisesti kaksilapsisen avaimen poistossa tarvittavaa seuraavan avaimen etsimistä; sen puuttumisesta on vähennetty 1 piste. Kaksilapsisen solmun tapauksen muista osista on saanut 2 pistettä, ja loput 3 pistettä yleisperiaatteen ja helpompien lapsettoman ja yksilapsisen tapauksen käsittelystä.
. [6 pistettä] Esitä, miten AVL-puun tasapainotus tapahtuu avaimen lisäyksen jälkeen. Sopiva esitystapa on muutama kuva ja niihin liittyvä lyhyt selitys mahdollisista tilanteista ja niiden käsittelemisestä. Ratkaisu: katso luentomateriaalia. Pisteytys: Täysien pisteiden saamiseksi on pitänyt esittää kaikki eri tavat tehdä kiertoja ja selittää, miten niiden välillä valitaan. Osapisteitä on saanut, jos kuitenkin on jollain tasolla selitetty kiertoja ja annettu ainakin yksi kunnollinen esimerkki. 5. [12 pistettä] Väritetty verkko. Tarkastellaan tilannetta, jossa suunnatun verkon jokaiseen kaareen liittyy väri, joka on joko punainen tai sininen. Muuten kaarilla ei ole painoja. Sanomme verkon polkua sallituksi, jos polulla ei missään kohdassa ole peräkkäin kolmea punaista kaarta. Siis aina viimeistään kahden peräkkäisen punaisen kaaren jälkeen pitää tulla sininen kaari tai polun pitää päättyä. (a) Jos kaarten väreistä ei tarvitse välittää, niin tunnetusti kahden solmun välinen lyhin polku ei käy missään solmussa useammin kuin kerran. Entä jos tarkastelemmekin lyhimpiä sallittuja polkua väritetyssä verkossa? Anna esimerkki väritetystä verkosta, jossa kahden solmun välinen lyhin sallittu polku käy samassa solmussa kahdesti. Ratkaisu: Allaolevassa verkossa lyhin sallittu polku a e on (a, b, c, d, c, e), joka käy solmussa c kahdesti: a b c e d Pisteytys: Tämä oli yleensä osattu erittäin hyvin. (b) Esitä tehokas algoritmi, joka saa syötteenä suunnatun väritetyn verkon G ja sen kaksi solmua s ja t ja palauttaa lyhimmän sallitun polun solmusta s solmuun t. Mikä on algoritmisi aikavaativuus? Algoritmista riittää esittää toimintaperiaate yleisellä tasolla. Voit käyttää apuna mitä tahansa kurssilla esitettyjä algoritmeja, niiden tunnettuja aikavaativuuksia jne. Ratkaisu: Olkoon verkossa G solmujen joukko V ja kaarten joukko E. Muodostetaan uusi verkko G, jonka solmujen joukko on V = V { 0, 1, 2 }. Siis jokaista alkuperäisen verkon solmua v kohti uuteen verkkoon tulee kolme solmua (v, 0), (v, 1) ja (v, 2). Verkko G on tavallinen suunnattu painottamaton verkko, siis erityisesti kaarille ei tule mitään värejä. Ajatuksena on, että luvut 0, 1 ja 2 vastaavat sitä, kuinka monta punaista kaarta on kuljettu edellisen sinisen kaaren jälkeen. Siis jos verkossa G on punainen kaari (u, v), niin verkkoon G laitetaan
kaaret ((v, 0), (u, 1)) ja ((v, 1), (u, 2)). Solmusta (v, 2) ei lähde kaarta, koska se vastaisi kolmatta peräkkäistä punaista kaarta eikä siis olisi sallittu. Vastaavasti jos verkossa G on sininen kaari (u, v), niin verkkoon G tulee kaari ((v, p), (u, 0)) kaikilla p = 0, 1, 2. Nyt (v 1,..., v k ) on sallittu polku väritetyssä verkossa G, jos ja vain jos joillain p i verkossa G on polku ((v 1, p 1 ),..., (v k, p k )). Saadaan seuraava algoritmi: i. Muodosta edellä kuvattu verkko G. ii. Suorita verkossa G leveyssuuntainen haku alkaen solmusta (s, 0). iii. Leveyssuuntaisen haun perusteella valitse lyhin solmusta (s, 0) alkava polku, joka päättyy johonkin solmuista (t, 0), (t, 1) tai (t, 2). Olkoon tämä polku ((v 1, p 1 ),..., (v k, p k )). iv. Nyt (v 1,..., v k ) on haluttu verkon G polku. Selvästi verkon G muodostaminen vie ajan O( V + E ). Leveyssuuntainen haku vie ajan O( V + E ) = O( V + E ). Siis koko algoritmin aikavaativuus on O( V + E ). Pisteytys: Tämä oli tarkoitettu haastavaksi tehtäväksi, jossa vaaditaan tunnetun algoritmin muuntamista uuden ongelman ratkaisemiseksi. Niinpä pisteitä ei ole saanut ratkaisuista, joissa on vain vedottu leveyssuuntaiseen hakuun tai Dijkstran algoritmiin selittämättä, miten niitä pitää tätä ongelmaa varten muokata. 6. [12 pistettä] Ilmoita kustakin seuraavista väitteistä, pitääkö se paikkansa. Perustele vastauksesi täsmällisesti. Kaikissa kohdissa oletetaan, että G on painotettu suuntaamaton verkko, jonka kaikilla kaarilla on eri paino. (a) Jos kahden solmun s ja t välinen lyhin polku sisältää kaaren e, niin kaari e sisältyy myös verkon G pienimpään virittävään puuhun. Ratkaisu: Väite ei pidä paikkaansa. Intuitiivisesti pienimpään virittävään puuhun valitaan kaaret siten, että koko verkon yhdistämisestä aihetuva kokonaiskustannus pysyy pienenä. Vaikka jokin kaari olisi kuinka hyvä kahden annetun solmun yhdistämisessä, se voi jäädä pois puusta, jos siitä ei ole hyötyä puun muiden osien kanssa. Täsmällisesti väite osoitetaan epätodeksi vastaesimerkillä. Esim. allaolevassa verkossa solmujen b ja c välinen lyhin polku koostuu yhdestä kaaresta, joka kuitenkaan ei kuulu pienimpään virittävään puuhun: a 2 3 b c (b) Jos e on jonkin verkon G syklin kaarista painoltaan pienin, niin se kuuluu verkon G pienimpään virittävään puuhun.
Ratkaisu: Väite ei pidä paikkaansa. Intuitiivisesti verkossa voi olla vaikka millaisia hyvin painavista kaarista koostuvia syklejä, eikä niiden perusteella voi suoraan tehdä mitään päätelmiä siitä, mitä kaaria pienimpään virittävään puuhun tulee. Vastaesimerkiksi sopii esim. seuraava verkko, jossa syklin (b, c, d, b) pienin kaari (b, c) ei kuulu pienimpään virittävään puuhun: a 2 3 b c 6 5 d (c) Jos e on jonkin verkon G syklin kaarista painoltaan suurin, niin se ei kuulu verkon G pienimpään virittävään puuhun. Ratkaisu: Väite pitää paikkansa. Todistus: Olkoon T jokin virittävä puu, joka sisältää kaaren e, ja S sykli, jonka painavin solmu e on. Kun kaari e poistetaan puusta, syntyvässä verkossa (V, T { e }) on kaksi yhtenäistä komponenttia. Koska poistettu kaari e yhdistää nämä kaksi komponenttia, syklissä S on ainakin yksi toinen kaari e, joka yhdistää näitä komponentteja. Siis (V, (T { e }) { e }) on virittävä puu. Koska oletuksen mukaan e oli syklin S kaarista painavin ja verkossa kaikilla kaarilla on eri paino, tämä uusi virittävä puu on kustannukseltaan alkuperäistä puuta pienempi. Olemme siis päätelleet, että mikään kaaren e sisältävä virittävä puu ei voi olla pienin. Arvostelusta: Tehtävässä oli tarkoitus testata sellaista puihin ja verkkoihin liittyvää täsmällistä päättelyä, jota on kurssilla esitetty pienempien virittävien puiden yhteydessä. Sen takia kovin epämääräisistä perusteluista ei ole saanut pisteitä. Itse asiassa virheellisissä ratkaisuissa varsin usein oli jo väitteen paikkansapitävyys arvioitu väärin.