811312A Tietorakenteet ja algoritmit 2015 - 2016 Kertausta kurssin alkuosasta II Algoritmien analyysi: oikeellisuus Algoritmin täydellinen oikeellisuus = Algoritmi päättyy ja tuottaa määritellyn tuloksen Algoritmin oikeaksi todistaminen = Todistettava algoritmin päättyminen ja oikea tulos Osattava todistaa algoritmi vääräksi Päättymisen todistaminen: usein käytetään konvergenttia, joka takaa toistorakenteen tai rekursion päättymisen Oikeellisuus: Toistorakenteisissa algoritmeissa usein invariantti, joka takaa oikean tuloksen kun algoritmi päättyy Invariantin muotoilu ja oikeaksi osoittaminen Ari Vesanen 811312A TRA, Kertausta II Algoritmien analyysi: asymptoottinen merkintä Osattava O ja Ɵ-merkinnät (määritelmä ja käyttö) Olkoon g(n) jokin funktio. Silloin O(g(n)) ja Ɵ(g(n)) ovat seuraavat funktioiden joukot: O( g (n)) { f (n) On olemassa sellaiset positiiviset vakiot c ja n0 , että 0 f (n) c g (n), aina kun n n0 } ( g ( n )) { f ( n ) On olemassa sellaiset positiiviset vakiot c1 , c2 ja n0 , että c1 g ( n ) f ( n ) c2 g ( n ), aina kun n n0 } Ari Vesanen 811312A TRA, Kertausta II Algoritmien analyysi: aikakompleksisuus Aikakompleksisuus = algoritmin suoritusaika (operaatioiden lukumäärä) suhteessa syötteen kokoon Ilmaistaan kompleksisuusluokkana O- tai Ɵmerkinnällä Yleensä tarkastellaan huonointa tapausta Osattava määrittää yksinkertaisen iteratiivisen tai rekursiivisen algoritmin kompleksisuusluokka Tentissä aina tällainen tehtävä, enimmäkseen iteratiivisia algoritmeja Jos tarvitaan Master Theoremia, se annetaan Ari Vesanen 811312A TRA, Kertausta Esimerkkitehtäviä a) Esitä mitä määritelmän mukaan tarkoittaa merkintä f(n) (n2). b) Onko f(n) (n2), kun f(n) = 2n2 + n f(n) = n3+2n+1 ? Perustele vastauksesi. Ari Vesanen 811312A TRA, Kertausta Esimerkkitehtäviä (2) Seuraavan algoritmin tulisi laskea summa 1+2+…+n aina kun n on positiivinen kokonaisluku. Todista algoritmi vääräksi. Syöte: Kokonaisluku n >= 1 Tuloste: Summa 1+2+...+n SUMMA(n) 1. s = 1 2. i = 1 3. if n == 1 4. return s 5. while i <= n do 6. s = s+i 7. i = i+1 8. return s Ari Vesanen 811312A TRA, Kertausta Esimerkkitehtäviä (3) Seuraava algoritmi laskee syötteenä saamansa taulukon alkioiden keskiarvon. Todista algoritmi oikeaksi. Syöte: Taulukko A[1,..,n], n >= 1 Tuloste: Taulukon alkioiden keskiarvo KESKIARVO(A) 1. s = 0 2. i = 1 3. ka = 0 4. while i <= n do 5. s = s+A[i] 6. i = i+1 7. ka = s/n 8. return ka Ari Vesanen 811312A TRA, Kertausta Esimerkkitehtäviä (4) Mitkä ovat seuraavien algoritmien aikakompleksisuusluokat, kun syötteen koon mittarina on syötetaulukon A[1..n] koko n? SUM1(A) 1. sum = 0 2. for i=1 to n 3. sum = sum + A[i] 4. return sum SUM2(A) 1. sum = 0 2. for i=1 to n 3. for j=1 to n 4. sum = sum+A[i]-A[j] 5. return sum Ari Vesanen SUM3(A) 1. max = 0 2. for i=1 to n 3. sum = 0 4. for j=i to n 5. sum = sum+A[j] 6. if sum > max 7. max = sum 8. return sum 811386A Tietorakenteet ja algoritmit, Tehtäviä III Lajittelualgoritmit Tiedettävä että nopeimpien vertailuun perustuvien lajittelualgoritmien aikakompleksisuus Ɵ(nlg(n)), kun n on taulukon koko Pikalajittelusta tunnettava idea: taulukko jaetaan saranaalkion suhteen ja osat lajitellaan rekursiivisesti Kekolajittelu: tunnettava maksimikeko tietorakenteena ja sen esittäminen taulukolla Kekolajittelun idea: Muodostetaan maksimikeko ja poistetaan siitä toistuvasti suurin alkio, sijoitetaan taulukon loppuun ja pienennetään keon kokoa Ari Vesanen 811312A TRA, Kertausta Esimerkkitehtäviä (5) Ovatko taulukot A=[15,10,12,7,5,9,8], B=[20,12,18,8,14,13] maksimikekojärjestyksessä? Sadistinen valmentaja harjoittaa 2n pelaajaa. Hän haluaa jakaa pelaajat kahteen joukkueeseen niin, että pelistä tulee mahdollisimman epätasainen. Minkälaista algoritmia hän voi käyttää jaon tekemiseen? Taulukossa on lukuja jotka halutaan järjestää niin, että negatiiviset luvut ovat taulukon alkuosassa ja positiiviset luvut loppuosassa. Anna tehokas algoritmi tämän tekemiseen. Ari Vesanen 811312A TRA, Kertausta Pikalajittelun muunnettu ositus Syöte: Taulukko A[1,..,n] n>=1 Tuloste: Taulukon vasemmalla puolella negatiiviset arvot ja oikealla positiiviset (ja nollat) OSITA(A) 1. i = 0 2. for j = 1 to n 3. if A[j] < 0 4. i = i + 1 5. vaihda A[i] A[j] 6. return Ari Vesanen 811312A TRA / 52144A ATR , Lajittelualgoritmeista 11 Esimerkkitehtäviä (6) Olkoon A[1..n] pienimmästä suurimpaan järjestetty kokonaislukutaulukko, jonka kaikki luvut ovat erisuuria. Suunnittele aikakompleksisuudeltaan luokkaa O(lg(n)) oleva algoritmi, joka vastaa kysymykseen, onko lukua i, jolle A[i] = i (kiintopiste). Ari Vesanen 811312A TRA, Kertausta Alkuperäinen puolitushaku Syöte: Taulukko A[1,..,n], n >= 1, A[1] <= A[2] <= … <= A[n]. Luvut 1<=p<=q<=n. Luku x jota haetaan taulukosta väliltä A[p,..,q]. Tulostus: Alkion x indeksi taulukossa tai arvo NIL, jos x ei esiinny taulukossa välillä A[p,..,q]. HAKU(A,p,q,x) 1. if p==q 2. if A[p]==x return p 3. else return NIL 4. else 5. r = (p + q)/2 6. if x<=A[r] 7. return HAKU(A,p,r,x) 8. else 9. return HAKU(A,r+1,q,x) Ari Vesanen 811312A TRA, Kertausta Kiintopisteen hakemisalgoritmi Syöte: Taulukko A[1,..,n], n >= 1, A[1] < A[2] < … < A[n]. Luvut 1<=p<=q<=n. Tulostus: TRUE jos A[i]=i jollakin i, FALSE muuten KIINTOPISTE(A,p,q) 1. if p==q 2. if A[p]==p 3. return TRUE 4. else return FALSE 5. else 6. r = (p + q)/2 7. if A[r]==r 8. return TRUE 9. else if A[r]>r 10. return KIINTOPISTE(A,p,r) 11. else 12. return KIINTOPISTE(A,r+1,q,x) Ari Vesanen 811312A TRA, Kertausta
© Copyright 2024