811312A Tietorakenteet ja algoritmit 2016-2017 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
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 positiiviset vakiot 0 ( g( n)) ( n) positiiviset vakiot c 1 f ( n) g( n) c g( n),aina { f f ( n) ( n) On olemassa c c ja On olemassa sellaiset c 2 1 n 0 kun, c 2,että n ja n 0 sellaiset n },että g( n),aina kun n 0 n 0 }
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
Esimerkkitehtäviä a) Esitä mitä määritelmän mukaan tarkoittaa merkintä f(n) (n 2 ). b) Onko f(n) (n 2 ), kun f(n) = 2n 2 + n f(n) = n 3 +2n+1? Perustele vastauksesi.
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
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
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 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
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.
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 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).
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)
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)