8111A Tietoraketeet ja algoritmit, 15-16, Harjoitus, Ratkaisu Harjoituksessa käsitellää asymptoottista merkitätapaa ja algoritmie aikakompleksisuutta. Tehtävä.1 a Oko f ( O( tai f (, ku 1 f ( f, 4 ( 5 f ( lg(? b Oko f ( O(, ku 1 f ( 1 f (? Perustele vastauksesi. Ratkaisu. Määritelmä mukaa f(, jos o olemassa reaalilukuvakiot c1> ja c> ja kokoaisluku site, että c1* f( c* aia, ku. Siis -otaatiolla esitetyt kompleksisuusluokat vaativat sekä ala- että yläraja. Vastaavasti määritelmä mukaa f( O(, jos o olemassa reaalilukuvakiovakio c> ja kokoaisluku site, että f( c* aia, ku. O-otaatiolla esitetyille kompleksisuusluokille riittää siis yläraja. Näi olle -otaatio kompleksisuusluokasta seuraa vastaava O-otaatio kompleksisuusluokka. a 1 Nyt 1* + = f( + = 4* aia, ku >1, jote f(. Tästä seuraa heti f( O(. Huom! Tässä oli c1 = 1>, c = 4> ja =1. a Ku, o 1 4 4 4 4 4 /9 ja siis / 9, mistä 5 5 /9 4 / 9. Olipa c mikä tahasa positiivie vakio, ii 4 4 / 9 c (ja 4 / 9 > c, kuha vai > 9c/4. Siis f ( O( ja tieteki myös f (. Huom! Tässä = max {9c/4, }. a Positiivisilla kokoaisluvuilla pätee aia lg(. Site lg( ja f ( O(. Jos olisi vakio c ja luku, joille lg( c eli c f ( c aia ku, ii lg( aia ku, mikä o mahdotota. Site f (. b 1 Ku f ( 1, ii f ( *, mistä seuraa, että ( O( f. b Olkoo joille f f ( ja oletetaa, että ( O( ( c aia ku. Silloi mikä o mahdotota. Siis f ( O(. f. Silloi olisi vakio c ja luku, c ( ja c aia ku,
Tehtävä. Seuraavaa lisäyslajittelua voidaa käyttää piete taulukoide lajitteluu. Algoritmi oikeellisuus o perusteltu lueoilla. Määritä (ja perustele algoritmi kompleksisuusluokka. Riittää tarkastella aioastaa huooita tapausta. Syöte: Taulukko A[,..,-1], >= 1 Tuloste: Tauluko luvut järjestyksessä A[] <= <= A[-1] LISAYS(A 1. for j = 1 to -1. k = A[j]. i = j-1 4. while i>= && A[i]>k 5. A[i+1] = A[i] 6. i = i-1 7. A[i+1] = k 8. retur Ratkaisu. Rivejä 1- suoritetaa -1 kertaa, samoi riviä 7. Jos taulukko o kääteisessä järjestyksessä (huooi tapaus, while-silmuka rivejä 5 ja 6 joudutaa suorittamaa jokaisella kierroksella j kertaa eli yhteesä 1++ + -1 = (-1/ kertaa. Rivi 8 suoritetaa kerra. Riviä 4 suoritetaa joka kierroksella yhde kerra eemmä kui se sisällä olevia rivejä, jote huooimmassa tapauksessa riviä 4 suoritetaa ++ + (-1 + = (-1/ + -1 kertaa. Site suoritettavia rivejä tulee pahimmassa tapauksessa 4(-1 + (-1/ + 1 + (-1/ + -1 = 4-4 + + 1 + / - / + -1 = / + 7/ -4. Huomataa, että lisäyslajittelu kompleksisuusluokka pahimmassa tapauksessa o (, sillä suurilla : arvoilla vaikuttavi termi o /. Voidaa myös osoittaa, että keskimääräie tapaus o samaa luokkaa. Tehtävä. Selvitä seuraavie rekursioyhtälöide ratkaisuje kompleksisuusluokat käyttäe lueoissa esitettyä lausetta M (Master Theorem: a 9T ( /, b c 16T ( / 4, T ( /.
Lause M. (Master Theorem Olkoot 1b 1 a kokoaislukuvakioita ja f fuktio. Rekursio a / b f ( a / b f ( samoi kui rekursio ratkaisulle pätee seuraavaa: 1 Jos f ( O( b jollaki vakiolla, ii logb a Jos f ( b, ii Jos ( ( b vakiolla 1 logb a lg f jollaki vakiolla ja jos a f ( / b c f ( c ja riittävä suurilla luvu arvoilla, ii f ( jollaki Ratkaisu. Kohdassa a o a 9, b, jote log 9 log. Edellee o b 1 f ( O( ja voidaa soveltaa lausee M esimmäistä kohtaa (tässä siis 1 ja saadaa b. Kohdassa b o a 16, b 4, jote log 16 log 4. Edellee f ( ( b 4 4, jote sovelletaa lausee M toista kohtaa ja saadaa b lg lg. f (. Näi olle log 1 Kohdassa c taas o a, b ja b ja koska 1 f ( O(, sekä a f ( / b ( / 1/ 4 1/ 4 f (, voidaa soveltaa lausee kolmatta kohtaa (tässä ja saadaa f (
Tehtävä.4 Seuraava rekursiivie algoritmi toteuttaa puolitushau järjestettyy taulukkoo. Testaa algoritmia hakemalla taulukosta A = [11,,1,47,5,68,71,89,94,15,11,16,1,148] alkio 15. Määritä lausee M avulla tiukka kompleksisuusluokka ( -otaatio. Syöte: Taulukko A[1,..,], >= 1, tauluko alkiot ovat kasvavassa järjestyksessä A[1] <= A[] <= <= A[]. Luvut 1<=p<=q<=. Luku x jota haetaa taulukosta väliltä A[p,..,q]. Tulostus: Alkio x ideksi taulukossa tai arvo -1, jos x ei esiiy taulukossa välillä A[p,..,q]. HAKU(A,p,q,x 1. if p==q. if A[p]==x. retur p 4. else 5. retur -1 6. else 7. r = (p + q/ 8. if x<=a[r] 9. retur HAKU(A,p,r,x 1. else 11. retur HAKU(A,r+1,q,x Ratkaisu. Ku haetaa arvoa 15 taulukosta A, saadaa seuraava kutsujoo: HAKU(A,1,14: r = 7 ja A[r] = 71; 15 > A[r] HAKU(A,8,14: r = 11 ja A[r] = 11; 15 <= A[r] HAKU(A,8,11: r = 9 ja A[r] = 94 <= 15; 15 > A[r] HAKU(A,1,11 : r = 1 ja A[1] = 15; 15 <= A[r] HAKU(A,1,1: p==q ja A[1]==15: palautetaa 1 Algoritmi palauttaa siis alkio 15 ideksi taulukossa A. Olkoo algoritmi suoritusaika T (, ku haetaa tauluko osasta, joka koko o paikkaa. Lukuu ottamatta rekursiivista kutsua, algoritmissa suoritetaa vakiomäärä vakioaikaisia operaatioita (korkeitaa kaksi vertailua ja yksi sijoitus. Näi olle rekursiota lukuu ottamatta suoritusaika o vakio c. Jos >1, taulukko puolitetaa ja kutsutaa algoritmia puolitetulle taulukolle. Tämä vie aja T (/. Näi saadaa rekursioyhtälö / c. Sovelletaa lausetta M: Nyt a 1, b, jote log 1 log. Edellee f ( c c ( b lg lg lg.. Site lausee M tapaukse mukaa Algoritmi o siis kompleksisuusluokaltaa logaritmie. b
Tehtävä.5. Ohjelmissa tarvitaa usei erilaiste objektie joukkoje satuaista järjestämistä. Esimerkiksi korttipelissä korttie sekoittamie peli alussa asettaisi paka 5 korttia satuaisee järjestyksee. Tällaista algoritmia saotaa satuaise permutaatio tuottamiseksi. Tarkastele seuraavaa kahta algoritmia, joilla voidaa järjestää tuottaa lukuje 1.. satuaise järjestykse sisältävä kokoaislukutaulukko A[..-1]. a Algoritmi 1, ilma aputaulukkoa Syöte: Luku >= 1. Taulukko A[,..,-1]. Tulostus: Taulukossa A luvut 1.. satuaisessa järjestyksessä. RAND_PERM_1(,A 1. for i = to -1. ewumber = false. while ot ewumber 4. x = satuaisluku väliltä 1.. 5. ewumber = true 6. for j = to i-1 7. if x == A[j] 8. ewumber = false 9. A[i] = x 1. retur b Algoritmi, käyttää aputaulukkoa Syöte: Luku >= 1. Taulukko A[,..,-1]. Tulostus: Taulukossa A luvut 1.. satuaisessa järjestyksessä. RAND_PERM_(,A 1. varaa taulukko used[1..]. for i = to -1. used[i] = false 4. for i = to -1 5. usedumber = true 6. while usedumber 7. x = satuaisluku väliltä 1.. 8. usedumber = used[x] 9. A[i] = x 1. used[x] = true 11. retur Ohjelmoi kumpiki algoritmi (joko C- tai Pytho-kielellä ja mittaa suorituksee kuluvaa aikaa kasvattae tauluko kokoa. Mikä kokoisilla taulukoilla o käytäöllistä suorittaa algoritmeja? Osaatko arvioida algoritmie aikakompleksisuutta? HUOM! Kumpikaa edellisistä ei ole erityise opea tapa tuottaa satuaispermutaatioita, vaa käytäöllisempää olisi soveltaa esimerkiksi seuraavaa algoritmia: Syöte: Luku >= 1. Taulukko A[,..,-1]. Tulostus: Taulukossa A luvut 1.. satuaisessa järjestyksessä. RAND_PERM(,A 1. for i = to -1. A[i] = i+1. for i = to -1 4. x = satuaisluku väliltä..i 5. vaihda A[i] ja A[x] 6. retur Halutessasi voit implemetoida tämäki algoritmi ja verrata suoritusaikoja edellisii.
Ratkaisu. Esimerkkiratkaisut o likitetty alle. Testitietokoeella saatii esimmäise algoritmi Pytho-toteutuksille seuraavat ajat (sekueissa vaihtelevakokoisilla taulukoilla: Tauluko koko 1 4 8 Aika (s.96. 14.1 54.1 Taulukosta ähdää, että Pytho-ohjelmasta tulee varsi käyttökelvoto ku tauluko koko lähestyy 1:a. Toie algoritmi o suorituskyvyltää huomattavasti parempi. Pytho-toteutuksille saatii seuraavat suoritusajat: Tauluko koko 5 5 Aika (s.5 1. 7.4 1.9 64.1 Pytho-ohjelma o siis käyttökelpoie vielä ku tauluko koko lähestyy miljooaa. C-ohjelmat ovat kääettyiä yleisesti opeampia kui Pytho-ohjelmat. C-kieliset toteutukset suoriutuivat seuraavasti: Algoritmi 1: Tauluko 5 1 4 koko Aika (s.95.65 17.8 5.8 56.8 Algoritmi : Tauluko 5 1 5 1 koko Aika (s.48 1.1.1 8.5 19.75 Suoritusajoista huomataa, että algoritmie asymptoottie kasvu o samalaista, mutta C- ohjelmaa voidaa suorittaa oi viis kertaa suuremmilla taulukoilla kui Pytho-ohjelmaa. Itse asiassa voidaa äyttää, että esimmäise algoritmi suoritusaika o luokkaa lg( ja toise algoritmi suoritusaika o luokkaa lg(, ku tauluko koko o. Taulukoidut suoritusajat ovat jokseeki tämä mukaiset. Suoritusaikoje aalyysi vaatii kuiteki meetelmiä, joita ei esitetä tällä kurssilla. Kolmas algoritmi o selvästi aikakompleksisuudeltaa lieaarie (luokkaa Θ(, ku tauluko koko o. Esimerkkitoteutuksissa o myös kolmas algoritmi implemetoitua. Ajamalla sitä voi havaita, että se o toistaki algoritmia opeampi.