583 Tietorkenteet j lgoritmit (kevät 205) Toinen välikoe, mllirtkisut. () Brnh n oun. Brnh n oun on lgoritmityyppi, joss tutkitn kikki ongelmn mhollisi rtkisuj puumisess rkenteess. Kun hvitn, että jokin rtkisuhr ei voi enää joht hluttuun lopputulokseen, sen tutkint lopetetn. Esimeriksi rnh n ouni voin käyttää kuppmtkustjn ongelmn rtkisemiseen - jos on löyetty jo jokin mhollinen kikkien kupunkien kutt kulkev reitti, voin hylätä kikki keskeneräiset reitit joien pituus on jo ksvnut tuot kokonist reittiä piemmäksi. () Yksinkertinen polku. Verkon polku on yksinkertinen, jos kukin polun solmu esiintyy polull vin kerrn. Polku lsketn yksinkertiseksi myös, jos sen viimeinen j ensimmäinen solmu ovt smt, jolloin polku kutsutn sykliksi. () Hrv verkko. Verkko snotn hrvksi, jos siinä on suhteellisesti vähän kri solmujen määrään n nähen. Esimerkiksi verkko, joss kri on kksinkertinen määrä solmujen määrään nähen on hrv (O(n) krt). Toislt verkoss, joss jokisest solmust on kri jokiseen muuhun solmuun on (n)(n ) = O(n 2 ) krt, eikä verkko tällöin ole hrv. () Suunntun verkon vhvsti yhtenäinen komponentti. Suunntun verkon solmut voin in jk vhvsti yhtenäisiin komponentteihin. Kunkin komponentin sisällä jokisest solmust on olemss polku muihin komponentin solmuihin. Täsmällisesti verkon vhvsti yhtenäisille komponenteille V, V 2,..., V n pätee siis: Jokinen solmu kuuluu tsn yhteen komponenttiin, ts. v V i v / V j, jos i j. Jokisest solmust on polku jokiseen smn komponenttiin kuuluvn solmuun, v V i j u V i v u j u v Jos u V i, v V j j i j, ei ole olemss molempi poluist u v j v u. Kusskin likohss toistui usein smt virheet. Brnh n oun oli usein sekoitettu hjoit j hllitse -peritteeseen, polun yksinkertisuus yksikäsitteisyyteen j verkon hrvuus ei-yhtenäisyyteen. Vhvsti yhtenäiset komponentit näkyivät olleen hyvin tieoss. Pisteen smiseen riitti lyhyt j ytimekäs määritelmä, pienistä epätrkkuuksist sttoi menettää ospisteitä, tehtävän kokonispisteet pyöristettiin lopuksi ylöspäin. 2. Tehtävännnoss minitut puopertiot voin toteutt mksimi-3-keolle seurvsti: prent(i) return (i + )/3 left(i) return 3i mile(i) return 3i
right(i) return 3i + Hepifyn toteutus ei itse siss trvitse prent-opertion toteutust, joten sen puuttumisest ei tietenkään menettänyt pisteitä. Vrsininen hepify voin toteutt nyt hyvin smll tvll kuin inäärikeolle, joskin suurin rvo täytyy nyt etsiä kikist kolmest lpsest khen sijn. Algoritmi voin toteutt esim. seurvsti: hepify(a,i) l = left(i) 2 m = mile(i) 3 r = right(i) 4 if l A.hep-size 5 lrgestvlue = A[l] 6 lrgestinex = l 7 if m A.hep-size && lrgestvlue < A[m] 8 lrgestvlue = A[m] 9 lrgestinex = m 0 if r A.hep-size && lrgestvlue < A[r] lrgestvlue = A[r] 2 lrgestinex = r 3 if A[i] < lrgestvlue 4 A[lrgestInex] = A[i] 5 A[i] = lrgestvlue 6 hepify(a, lrgestinex) Riveillä -3 solmun i lpset otetn muuttujiin l,m j r, kuten luennoill esitetyssä inäärikeon lgoritmiss. Uloin if-ehto rivillä 4 trkist onko solmull vsent lst, toisin snoen onko lpsi ollenkn. Jos vsen lpsi on olemss, setetn vsen lpsi suurimmksi löyetyksi lpsisolmuksi. Tämän jälkeen riveillä 7-2 trkistetn, löytyykö solmult muit lpsi j onko suurin rvo josskin niistä. Riville 3 tultess lsten suurin rvo on löytynyt, j sen rvo on muuttujss lrgestvlue j ineksi kekotulukoss muuttujss lrgestinex. Rivin if-ehto trkist, onko lsten suurin rvo suurempi kuin solmun i rvo, j jos on, suoritt rvojen vihot j rekursiokutsun kuten inäärikeon tpuksess (rivit 4-6). Hepify-opertio on selvästi vkioikinen lukuunottmtt viimeisen rivin rekursiokutsu, joten suorituksen ikvtivuus määräytyy suoritettujen rekursiokutsujen määrän mukn. Keon kullkin solmull (limpi kht tso lukuunottmtt) on kolme lst, joten keon korkeueksi sn O(log 3 (n)), joten myös hepifyopertion phimmn tpuksen ikvtivuus on O(log 3 (n)). Huomttvn pljon pistemenetyksiä iheutti hepifyn sekoittminen hep-insertiin, jolloin kekoehto korjttiin rkenteess ylöspäin. Monelt vstjlt oli myös unohtunut trkist, kuuluuvtko lkiot left, mile j right kekoon. Suuress osss lähes oikeit rtkisuj hepify toimii väärin keon limmn tson lpsi trkstelless, jos A.hep-size==m j A[l]>A[m]. Täyet pisteet si toimivll lgoritmill, jonk puopertiot oli kirjoitettu oikein uki j ikvtivuus nnettu oikein. Yksittäinen pieni 2
huolimttomuusvirhe ei välttämättä johtnut pistemenetyksiin jos se ei vikuttnut lgoritmin rkenteeseen rtkisevsti. 3. () Oike vstus on kyllä j pelkästään oikest vstuksest si yhen pisteen. Tässä esimerkki eräästä tvst toist väite: Toistuksemme muistutt hiemn lemmn 8.8 toistust. Olkoon meillä verkko G = (V, E), jok toteutt tehtävännnon ehot, eli khell eri krell ei ole sm pino. Olkoon S V joukko verkon G solmuj. Lemmn 8.8 perusteell tieetään, että jos e on kevyin kri, jok yhistää solmut joukoist S j V \S, niin se kuuluu johonkin pienimpään virittävään puuhun. Toistetn, että tässä tpuksess se kuuluu itsesiss jokiseen pienimpään virittävään puuhun. Tehään vstoletus: on olemss pienin virittävä puu T, johon e ei kuulu. Nyt kun lisäämme puuhun T kren e, niin siihen syntyy sykli. Täten puuss T on olemss sellinen kri e, että se yhistää joukkoihin S j V \S kuuluvt solmut j T = (T \{e }) {e} on puu. Nyt e e, joten kri e on iosti pinvmpi kuin e, j täten puun T pino on iosti pienempi kuin puun T pino, eikä T voi oll pienin virittävä puu. Täten kri e kuuluu jokiseen pienimpään virittävään puuhun. Nyt voimme toist pienimmän virittävän puun yksikäsitteisyyen. Olkoon v mielivltinen verkon G solmu, merkitään S = {v }. Nyt kevyin kri e, jok yhistää joukot S j V \S kuuluu jokiseen pienimpään virittävään puuhun. Olkoon sitten v 2, se kren e päätepiste, jok ei kuulu joukkoon S, j S 2 = S {v 2 }, nyt meillä on yksikäsitteinen kri e 2, jok on kevyin joukot S 2 j V \S 2 yhistävä kri... Tätä jtkmll smme vlituksi kret e, e 2,..., e n, missä n = V, jotk kuuluvt jokiseen pienimpään virittävään puuhun. Kosk virittävässä puuss voi oll enintään n krt, on pienimpiä virittäviä puit inostn yksi. Vihtoehtoinen tp. Olkoon G verkko, jonk jokisen kren pino on eri j T Krusklin lgoritmin löytämä pienin virittävä puu verkolle G. Olkoon T jokin pienin virittävä puu siten että T T. Nyt on kevyin sellinen kri e T, jok ei ole puuss T. Tätä krt kevyemmille krille f pätee f T f T, sillä ensinnäkin tieetään, että jos w(f) < w(e) j f T, niin f T, sillä e oli kevein puun T kri, jok ei kuulu puuhun T. Toislt jos tällinen f T, niin selvästikään se ei voi muoost sykliä sellisten puuss T olevien krien g knss, joien pinolle pätee w(g) < w(e), sillä nämä sisältyvät myös puuhun T. Täten Krusklin lgoritmin on vlittv myös tämä kri puuhun T. Olkoon e = (, ). Nyt siinä yksiselitteisessä yksinkertisess poluss pisteestä pisteeseen puuss T on oltv kri e, jonk pino on suurempi ti yhtä suuri kuin kuin kren e pino, muuss tpuksess tämä polku sisältyisi puuhun T j yhessä kren e knss näistä stisiin muoostettu sykli. Kosk e T j jokisell krell on eri pinot, pätee w(e ) > w(e). Täten (T \{e }) {e} on puu, jok virittää verkon G j jonk pino on iosti pienempi kuin puun T pino, eikä T voi oll täten pienin virittävä puu. Olemme toistneet, että T on verkon G ino pienin virittävä puu. Joitkin toistusyritelmiä j mikä niissä menee pieleen: Ehkä yleisin mok tässä tehtävässä oli olett, että jos T j T ovt verkon G pienimpiä virittäviä puit, niin ne erovt vin yhellä krell, j tässä tpuksess yk- 3
sikäsitteisyyen toistminen on hyvin helppo. Tämä ei kuitenkn toist mitään tilnteest, joss puut erovt enemmällä kuin yhellä krell. Toinen kohtuullisen yleinen tp yrittää toist tätä väitettä oli toet, että Krusklin lgoritmin ti Primin lgoritmin löytämät pienimmät virittävät puut ovt yksikäsitteiset. Näistä lgoritmeist tieetään kuitenkin vin se, että ne löytävät jonkun pienimmän virittävän puun, kikki pienimmät virittävät puut eivät välttämättä ole löyettävissä näillä lgoritmeil (ti inkn tätä ei ole kurssill toistettu, eikä kenenkään koevstuksess). Yksi tp oli trkstell solmujen jko khteen epätyhjään joukkoon j olett, että pienimmässä virittävässä puuss on vin yksi kri, jok yhistää nämä joukot. Tämäkään ei ole tott, jok nähään esimerkiksi miettimällä pienimmän virittävän puun kksiväritystä, väreinä vlkoinen j must. Tällöin jos otetn trkstelunlisiksi joukoiksi vlkoiset solmut j mustt solmut, niin jokinen pienimmän virittävän puun kri yhistää nämä joukot. Viimeisenä esimerkkinä on toistusyritelmä inuktioll, joit oli muutmi. Juoni meni suunnilleen näin: jos verkoss on solmu, niin väite pätee selvästi. Päteköön väite sitten verkolle, joss on m solmu. Jos tälliseen verkkoon G lisätään yksi solmu s j jokin joukko kri solmust s verkkoon G, niin smme verkon G. Nyt verkon G pienin virittävä puu on T e, missä T on verkon G (yksikäsitteinen) pienin virittävä puu j e on kevein krist, jok yhistää solmun s verkkoon G, j se on täten yksikäsitteinen. Tässä rtkisuss ei otet huomioon sitä, että verkon G pienimmässä virittävässä puuss voi oll usempi kuin yksi näistä "uusist krist". Kuten iemmin toettiin, si tehtävästä yhen pisteen jo oikell rvuksell. Kksi pistettä si hiemn puutteellisest, mutt muuten järkevästä toistusyrityksestä. () Väite on epätosi, j siihen on melko yksinkertinen vstesimerkki. Verkon pienimpiä virittäviä puit ovt muun muss 4
eli niitä on inkin 6, vikk verkoss on kri vin 5. Pelkästä oikest vstuksest si yhen pisteen, kksi pistettä si jos oli puutteellinen/muuten ongelmllinen, mutt jossin määrin järkevä vstesimerkki. 4. Tehtävä on vnh lskuhrjoitustehtävä vk t5. Algoritmin perusien oikein smisest si 4p, p jos ikvtivuus oli nlysoitu oikein j p si myös siitä, että lgoritmi toell löytää turvllisimmn polun, eikä vin toennäköisyyttä mtktvroien ktomiselle turvllisimmll polull. Pisteitä menetti muun muss liin tehottomst ohjelmst, tehtävännnoss ei suorn minittu mitään tehokkusvtimuksi ohjelmlle, mutt trkoituksen on etsiä tietynlinen polku verkost jonk solmuin ovt kikki milmn lentokentät j krin kikki näien väliset suort lennot. Täten eksponentilinen lgoritmi ei tule kysymykseenkään, sillä sellisell ongelmn rtkisuun stt mennä jop miljooni vuosi, ti pljon enemmänkin. Myös siitä menetti pisteitä, jos ei ollut selkeästi kertonut, mitä kohti pitää muutt verkoss ti Dijkstrss. 5