Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja

Samankaltaiset tiedostot
(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

Algoritmi on periaatteellisella tasolla seuraava:

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

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

Algoritmit 2. Luento 14 Ke Timo Männikkö

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

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

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

1.4 Funktioiden kertaluokat

Algoritmit 1. Luento 5 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

Algoritmit 1. Luento 2 Ke Timo Männikkö

On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen.

Algoritmit 2. Demot Timo Männikkö

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

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

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista).

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

Algoritmit 2. Luento 2 To Timo Männikkö

2.1. Tehtävänä on osoittaa induktiolla, että kaikille n N pätee n = 1 n(n + 1). (1)

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Tarkennamme geneeristä painamiskorotusalgoritmia

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 14 Ke Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Algoritmit 2. Luento 13 Ti Timo Männikkö

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

Kanta ja dimensio 1 / 23

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

Algoritmit 1. Luento 13 Ti Timo Männikkö

4. Joukkojen käsittely

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

Algoritmit 1. Demot Timo Männikkö

Tietorakenteet, laskuharjoitus 2,

5 Kertaluokkamerkinnät

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Algoritmit 2. Luento 7 Ti Timo Männikkö

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

Algoritmit 1. Luento 3 Ti Timo Männikkö

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

Algoritmit 1. Luento 1 Ti Timo Männikkö

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

Nopea kertolasku, Karatsuban algoritmi

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

7 Vapaus. 7.1 Vapauden määritelmä

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

9 Erilaisia tapoja järjestää

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

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

Algoritmit 1. Luento 12 Ti Timo Männikkö

Avaruuden R n aliavaruus

4.3. Matemaattinen induktio

Algoritmit 1. Luento 13 Ma Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

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

Ellipsoidimenetelmä. Samuli Leppänen Kokonaislukuoptimointi. S ysteemianalyysin Laboratorio

isomeerejä yhteensä yhdeksän kappaletta.

Tietorakenteet ja algoritmit - syksy

Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys.

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari

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

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.

(iv) Ratkaisu 1. Sovelletaan Eukleideen algoritmia osoittajaan ja nimittäjään. (i) 7 = , 7 6 = = =

811120P Diskreetit rakenteet

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

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

Esimerkkejä vaativuusluokista

Lineaarinen optimointitehtävä

Algoritmit 2. Luento 14 To Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

1 + b t (i, j). Olkoon b t (i, j) todennäköisyys, että B t (i, j) = 1. Siis operaation access(j) odotusarvoinen kustannus ajanhetkellä t olisi.

2017 = = = = = = 26 1

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

Algoritmit 1. Luento 8 Ke Timo Männikkö

7.4 Sormenjälkitekniikka

3 Suorat ja tasot. 3.1 Suora. Tässä luvussa käsitellään avaruuksien R 2 ja R 3 suoria ja tasoja vektoreiden näkökulmasta.

C.C. McGeoch, Toward an experimental method for algorithm simulation. algorithm simulation = algoritmin testaus, experimental algorithmics

Ennakkotehtävän ratkaisu

Johdatus graafiteoriaan

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

811120P Diskreetit rakenteet

Yhteydettömän kieliopin jäsennysongelma

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

1 2 x2 + 1 dx. (2p) x + 2dx. Kummankin integraalin laskeminen oikein (vastaukset 12 ja 20 ) antaa erikseen (2p) (integraalifunktiot

Epälineaaristen yhtälöiden ratkaisumenetelmät

A-osa. Ratkaise kaikki tämän osan tehtävät. Tehtävät arvostellaan pistein 0-6. Taulukkokirjaa saa käyttää apuna, laskinta ei.

Mat Lineaarinen ohjelmointi

1 Erilaisia tapoja järjestää

Luku 8. Aluekyselyt. 8.1 Summataulukko

DIFFERENTIAALI- JA INTEGRAALILASKENTA I.1. Ritva Hurri-Syrjänen/Syksy 1999/Luennot 6. FUNKTION JATKUVUUS

Transkriptio:

58053-7 Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja Malliratkaisut ja pisteytysohje: Jyrki Kivinen Tentin arvostelu: Jouni Siren (tehtävät 1 ja 2) ja Jyrki Kivinen (tehtävät 3 ja 4) 1. Pop-Until-operaatio toimii siis seuraavasti: Pop-Until(x): repeat if Empty then y := x else y := Pop until y = x Operaatioiden todelliset kustannukset ovat kertaluokan tarkkuudella Push 1 Pop 1 Pop-Until(x) 1 + min { k, pinon koko } missä k on alkion x ensimmäisen esiintymän syvyys pinossa. (Sovitaan k = pinon koko + 1 jos alkiota ei löydy.) Nämä ovat oleellisesti samat kuin MultiPop-operaatiolla varustetussa pinossa (luennot s. 106), joten analyysikin sujuu samalla tavalla: joko kirjanpitomenetelmällä (s. 108) tai potentiaalimenetelmällä (s. 111). Pisteytys: 1 piste toteutuksesta 3 pistettä tasoitetun analyysin peruskäsitteistön (kirjanpito tai potentiaali) käyttämisestä 2 pistettä analyysin loppuunviemisestä Huomautuksia: Tehtävän tarkoitus oli testata tasoitetun analyysin ymmärtämistä, joten pelkästä toteutuksesta ei ole saanut enempää pisteitä. Yleensä tehtävä oli joko osattu (5 6 p.) tai sitten ei (0 1 p.) 2. Jos A on valmiiksi nousevassa järjestyksessä, Partition palauttaa k = i ja rekursiivisissa kutsuissa osataulukkojen koot ovat k 1 i + 1 = 0 ja j (k + 1) + 1 = j i. Jos siis T (k) on kutsun QuickSort(A, i, j) aikavaativuus kun i j + 1 = k, saadaan (kun n 1) Tässä c on Partition-kutsun vakiokerroin. T (n) T (n 1) + cn n = c k + T (0) k=1 n(n + 1) = c + T (0) 2 = Θ(n 2 ). Pahimman tapauksen aikavaativuuden parantamiseksi voidaan valita pivot := Select(A, n/2 ), missä n = j i + 1 ja Select on luennoilla esitetty mediaaninetsimisalgoritmi, ja asettaa rekursiivisissa kutsuissa k = n/2. Koska Select toimii lineaarisessa ajassa, saadaan T (n) = T ( n/2 1) + T ( n/2 ) + Θ(n) = 2T (n/2) + Θ(n),

mistä seuraa T (n) = Θ(n log n) luennoilla esitettyjen tulosten mukaan (esim.master-teoreema). Pisteytys: 2 pistettä siitä, että on todettu mitä algoritmi tekee järjestetyllä syötteellä ja analysoitu aikavaativuus oikein 2 pistettä mediaanialgoritmin käyttämisestä ja sen lineaarinen aikavaativuuden toteamisesta 2 pistettä muokatun algoritmin aikavaativuusanalyysista Huomautuksia: Kuten monet olivat todenneetkin, mediaanialgoritmin käyttäminen ei ole käytännössä järkevää, koska siitä aiheutuu suuri vakiokerroin ja yksinkertaisempiakin O(n log n)- järjestämisalgoritmeja tunnetaan. Tässä esitetty kysymys kuitenkin vaatii vastauksekseen juuri mediaania. Tyypillinen virhe oli esittää satunnaista tai jotain heuristisesti valittua jakoalkiota. Erityisesti on huomattava, että keskiarvon käyttäminen ei ole lainkaan sama kuin mediaanin. Toinen virhe oli, ettei ollut todettu mediaanialgoritmin lineaarisuutta. 3. Ahne algoritmi kohtaan (a): I := c := 0 valitse i { 1,..., n } I jolla s i on pienin while c + s i L do c := c + s i I := I { i } valitse i { 1,..., n } I jolla s i on pienin return I (Pienimmän arvon s i etsiminen on yleisessä tapauksessa tehokkainta toteuttaa kasan avulla, mutta tämä ei tässä yhteydessä ole oleellista.) Lause Ahne algoritmi palauttaa optimaalisen ratkaisun, ts. sellaisen I { 1,..., n } että i I s i L ja I on pienin mahdollinen. Todistus Osoitetaan induktiolla, että I on aina jonkin optimaalisen ratkaisun osajoukko. Aluksi I = ja väite pätee. Olkoon I J jollain optimaalisella J, ja tarkastellaan tilannetta, kun algoritmi päivittää I := I { i }. Tällöin siis erityisesti I { i } on laillinen ratkaisu, joten J I + 1. Jos i J, väite selvästi pysyy voimassa. Jos i J, valitaan jokin j J I. Alkioiden i valintaperiaatteen nojalla s i s j. Siis J { s j } s i on optimaalinen ratkaisu, jonka osajoukko I { s i } on. Siis I on aina jonkin optimiratkaisun osajoukko. Kun suoritus päättyy, mikään joukon I aito ylijoukko ei ole edes laillinen ratkaisu, joten I itse on optimaalinen ratkaisu. Ahne algoritmi kohtaan (b): I := H := { 1,..., n } c := 0 b := min i s i while c + b L do valitse i H jolla s i on suurin H := H { i } if c + s i L c := c + s i I := I { i } return I 2

Algoritmi ei aina tuota optimaalista ratkaisua, esim. tapauksessa n = 4, s 1 = 1/2, s 2 = 1/3, s 3 = s 4 = 1/4 algoritmi tuottaa I = { 1, 2 } vaikka optimaalinen olisi { 1, 3, 4 }. Pisteytys: Sekä (a)- että (b)-kohdassa 1 piste algoritmista, 2 pistettä optimaalisuustarkastelusta. Algoritmit sinänsä ovat aika ilmeisiä, pääpaino oli optimaalisuuden tai ei-optimaalisuuden täsmällisessä toteamisessa. Huomautuksia: Tyypillisessä vastauksessa kaikki muu oli oikein, mutta (a)-kohdan todistus hyvin epämääräinen. Tehtävässä nimenomaan pyydettiin todistuksia, ja kaikki muu olikin itse asiassa aika ilmeistä, joten tässä nimenomaan haluttiin täsmällinen päättelyketju (vaikka tietysti esim. tieteellisessä artikkelissa tämän tasoiset jutut sivuutetaan ilmeisinä). Monissa vastauksissa on oleellisesti todettu, että I minimoi summan i I s i kun I on kiinnitetty. Miten tästä seuraa se mitä halutaan, eli että I maksimoi koon I kun summa i I s i on rajoitettu? Voiko olla olemassa J jolla J > I (vaikka jopa J = I + 2) ja i I s i < i J s i L? Vastaus on tietysti, että ei voi, mutta tämä ei ole mitenkään sen ilmeisempää kuin se alkuperäinen väite, jota tässä ollaan todistamassa. Sivuhuomautus: Kohdan (b) ongelma sisältää osatapauksenaan NP-täydellisen ongelman Partition: Annettu: s 1,..., s n Kysymys: päteekö i I s i = 1 2 n i=1 s i jollain I { 1,..., n } Tarkan polynomisen algoritmin löytyminen olisi siis ei-luultavaa. 4. Perusratkaisu: Muodostetaan taulukot L[1... n] ja P [1... n], missä L[k] on pisimmän alkioon A[k] päättyvän kasvavan jonon pituus ja P [k] sen toiseksi viimeisen alkion indeksi. Siis ( reunoja lukuunottamatta) L[i] = L[P [i]] + 1 ja P [i] on sellainen j, että A[j] < A[i] (jolloin alkioon A[j] päättyvä jono voidaan jatkaa alkioon A[i]) ja L[j] < i on suurin mahdollinen. Muodostetaan taulukot vasemmalta alkaen, ja pidetään samalla muuttujissa l ja k kirjaa pisimmän löydetyn jonon pituudesta ja päätepisteestä. Lopuksi luetaan pisin löydetty jono taulukkoon S[1... l]. l := 1 for i := 1 to n do L[i] := 1 P [i] := 0 for j := 1 to i 1 do if A[j] < A[i] and L[j] + 1 > L[i] then L[i] := L[j] + 1 P [i] := j if L[i] > l then l := L[i] k := i for j := 1 to l do S[l j + 1] := k k := P [k] Aikavaativuus on selvästi O(n 2 ). Bonusratkaisu: Aikavaativuus on väistämättä Ω(n 2 ), jos halutaan laskea koko taulukko L[1... n]. Osa arvoista L[i] on kuitenkin turhia sikäli, että jo arvoa L[i] laskettaessa voidaan todeta, että pisin kasvava polku ei missään tapauksessa voi kulkea alkion A[i] kautta. Näin on, mikäli jokin j toteuttaa kaikki seuraavat kolme ehtoa: 3

(a) j < i, (b) A[j] < A[i] ja (c) L[j] > L[i]. Nimittäin ehtojen (a) ja (b) nojalla millä tahansa alkion A[i] kautta kulkevalla kasvavalla jonolla voidaan alkioon A[i] päättyvä alkusegmentti korvata alkioon A[j] päättyvällä, ja ehdon (c) nojalla näin voidaan pidentää jonoa. Pidetään edelleen kiinni käsittelyjärjestyksestä vasemmalta oikealle. Siis alkion A[i] tullessa käsittelyvuoroon on jo löydetty kaikki tarpeelliset jonot osataulukosta A[1... i 1]. Edellisen perusteella tarpeellisiksi jonoiksi riittää tulkita kullakin jononpituudella k se jono, jonka viimeinen arvo on pienin. Olkoon tämän jonon viimeinen indeksi talletettu arvoksi R[k]. Siis alkion A[i] tullessa käsittelyvuoroon seuraavan pitää päteä kaikilla k: (a) jos osataulukossa A[1... i 1] on kasvava k alkion jono, niin R[k] < i, (b) jokin k alkion kasvava jono päättyy alkioon R[k] ja (c) jos jokin k alkion kasvava jono päättyy alkiooon j < i, niin A[j] A[R[k]]. Sovitaan, että jos k alkion kasvavia jonoja ei vielä ole löydetty, niin R[k] = n + 1. Alkion A[i] käsittelyssä pitää siis huolehtia, että tämä invariantti saadaan voimaan, kun i korvataan arvolla i + 1. Siis jos jokin k alkion kasvava jono päättyy alkioon A[i], ja A[i] < A[R[k]], pitää vaihtaa R[k] := i. Kuinka monella arvolla k tämä vaihto voidaan joutua tekemään? Tarkastellaan jonoa A[R[1]],..., A[R[l]], missä l on pisimmän löydetyn kasvavan jonon pituus, eli löydettyjen tarpeellisten jonojen viimeisiä alkioita jonon pituusjärjestyksessä. Keskeinen havainto on, että tämä jono on aidosti kasvava. Nimittäin jos jokin k alkion kasvava jono päättyy alkioon A[R[k]] missä R[k] i, niin varmasti jokin k 1 alkion kasvava jono päättyy johonkin alkioon A[j] jolla A[j] < A[R[k]] ja j < R[k] i. Siis on olemassa korkeintaan yksi sellainen k, että A[R[k]] < A[i] A[R[k + 1]]. Nyt alkio A[i] ei kelpaa minkään yli k-alkioisen jonon jatkoksi, koska nämä kaikki menevät alkion A[i] yli. Pituuksia k < k oleville jonoille A[i] kyllä kelpaisi jatkoksi, mutta saatavat jonot olisivat turhia, koska parempiakin on jo löydetty. Ainoastaan tällä yhdellä k alkio A[i] voi aidosti parantaa (k + 1)-alkioisten jonojen tilannetta (eli alentaa loppupistettä). Ottamalla tarkemmin huomioon, mitä reunoilla tapahtuu, saadaan seuraava algoritmi: A[0] := A[n + 1] := + R[0] := 0 R[1] := 1 for i := 2 to n do R[k] := n + 1 l := 1 for i := 2 to n do etsi binäärihaulla k { 0,..., l } jolla A[R[k]] < A[i] A[R[k + 1]] if A[i] < A[R[k + 1]] then R[k + 1] := i P [i] := R[k] if k = l then l := l + 1 i := R[l] for j := 1 to l do S[l j + 1] := A[i] i := P [i] 4

Edellä esitetyn perusteella binäärihaku todella löytää yksikäsitteisen oikean arvon k. Binäärihaun aikavaativuus on O(log l) = O(log n), joten koko algoritmin aikavaativuus on O(n log n). Pisteytys ja huomautuksia: Selvästi tyypillisin virhe oli, että oli ratkaistu rajoitetumpi ongelma, jossa kasvavan jonon vaaditaan olevan yhtenäinen; siis i j+1 = i j + 1. Joko oli selvästi luettu tehtävä väärin, tai muuten päädytty algoritmiin joka ratkaisee vain em. rajoitetun ongelman. Tämä rajoitus muuttaa tehtävän helpoksi ohjelmointitehtäväksi, ja lisäksi jo tehtävänannosta olisi pitänyt arvata, että oikea ratkaisu ei voi olla helppo O(n) algoritmi. Tämän takia tämän rajoitetun ongelman ratkaisevista algoritmeista on saanut nolla pistettä. Jos edellinen virhe oli vältetty, oli tyypillisesti löydetty jokin toimiva taulukointi-idea. Toteutuksen korrektiuden mukaan tästä on tullut 4 6 pistettä. Jos on selvästi yritetänyt tehdä jotain ei-yhtenäisten jonojen ongelmalle, mutta ei ole löydetty taulukointi-ideaa, on saanut 1 2 pistettä. Bonustehtävään ei ollut varteenotettavia ratkaisuyrityksiä, mutta se onkin hyvin vaikea ratkaista tenttitilanteessa. 5