81112A Tietoraketeet ja algoritmit, 217-218, Harjoitus 4, Ratkaisu Harjoitukse aiheita ovat algoritmie aikakompleksisuus ja lajittelualgoritmit Tehtävä 4.1 Selvitä seuraavie rekursioyhtälöide ratkaisuje kompleksisuusluokat käyttäe lueoissa esitettyä lausetta M (Master Theorem: a 9T ( /, b 9T ( /. Lause M. (Master Theorem Olkoot a 1 b 1 kokoaislukuvakioita ja f fuktio. Rekursio a / b f ( samoi kui rekursio a / b f ( ratkaisulle pätee seuraavaa: log a 1 Jos f ( O( b jollaki vakiolla, ii 2 Jos f (, ii lg log a Jos f ( ( b jollaki vakiolla ja jos a f ( / b c f ( jollaki vakiolla c 1 ja riittävä suurilla luvu arvoilla, ii f ( 2 Ratkaisu. Kohdassa a o a 9, b, jote log a log 9 log 2. Verrataa fuktiota f ( O( 1 ja saadaa f ( fuktioo 2 1 b 2, joka o merkittävästi suurempi kui f(; tässä, jolloi voidaa soveltaa lausee M esimmäistä kohtaa (edellä siis log a 2 b. Kohdassa b ovat a ja b kute edellä ja f (. Nyt verrataa fuktiota f( fuktioo 2, joka o merkittävästi pieempi kui f(; tällä kertaa 2 1 ( O( f, sekä a f ( / b 9 ( / 1/ 1/ f (. Site voidaa soveltaa lausee kolmatta kohtaa (tässä 2 ja saadaa f (
Tehtävä 4.2 Seuraava rekursiivie algoritmi toteuttaa puolitushau järjestettyy taulukkoo. Testaa algoritmia hakemalla taulukosta A = [11,2,1,47,52,68,71,89,94,15,112,126,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[2] <= <= 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 2. if A[p]==x. retur p 4. else 5. retur -1 6. else 7. r = (p + q/2 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] = 112; 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 paikkaa tauluko osasta, joka koko o. Lukuu ottamatta rekursiivista kutsua, algoritmissa suoritetaa vakiomäärä vakioaikaisia operaatioita (korkeitaa kaksi vertailua ja yksi laskutoimitus sekä 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 (/ 2. Näi saadaa rekursioyhtälö / 2 c. Sovelletaa lausetta M: Nyt a 1, b 2, jote log a log 1 log 2. Edellee f ( c c ( log a b lg lg lg.. Site lausee M tapaukse 2 mukaa b 2 2 Algoritmi o siis kompleksisuusluokaltaa logaritmie. Tämä olisi ollut varsi helppo päätellä myös käyttämättä lausetta M, koska tauluko osa puolittuu jokaisella kutsulla.
Tehtävä 4. Lukujoo tyyppiarvoksi eli moodiksi saotaa siiä useimmi esiityvää lukua. Esimerkiksi joo,1,2,5,,,4,1,4,4,,5 tyyppiarvo o. Suuittele ja implemetoi (joko C- tai Pytho-kielellä algoritmi, joka etsii lukutauluko A moodi. Algoritmi aikakompleksisuusluokka saa olla O( lg(, ku syötetauluko koko o. Ratkaisu. Käytetää hyväksi lajittelua: Suuruusjärjestyksee saatetusta taulukosta o helppo hakea moodi käymällä taulukko kerra läpi: Lasketaa kuika mota kertaa sama arvo esiityy peräkkäi ja pidetää yllä tietoa siitä, mikä arvo o esiityyt suurimma määrä kertoja. Tällöi algoritmiksi saadaa seuraava: Syöte: Taulukko A[1,..,], >= 1. Tulostus: Tauluko alkioide tyyppiarvo MODE(A 1. HEAPSORA //Lajittele taulukko käyttäe kekolajittelua 2. mode = A[1]. freq = 1 4. temp = 1 5. i = 2 6. while i <= do 7. if A[i]!= A[i-1] 8. temp = 1 9. else 1. temp = temp + 1 11. if temp > freq 12. freq = temp 1. mode = A[i] 14. i = i+1 15. retur mode Ku tullaa algoritmi riville 2, taulukko o järjestyksessä. Aluksi muuttuja mode o tauluko esimmäie arvo. Silmukassa tarkastellaa tauluko jokaie alkio ideksistä 2 lähtie. Muuttuja temp laskee kulloiki tarkasteltava tauluko arvo esiitymiskertoja: ku arvo vaihtuu, aloitetaa uudellee arvosta 1. Muuttuja freq arvo o toistaiseksi useimmi esiityee arvo esiitymislukumäärä: jos muuttuja temp arvo ylittää muuttuja freq arvo, muuttujaa freq päivitetää ja myös muuttuja mode päivitetää taulukossa esiityväksi arvoksi. Näi olle muuttuja mode arvo o tauluko tarkastellu osa moodi. Ku algoritmi päättyy, muuttuja arvo o koko tauluko moodi. Algoritmi etsii siis tauluko moodi. Kekolajittelu aikakompleksisuus o luokkaa O( lg(. Tämä lisäksi algoritmissa tehdää vakioaikaie operaatio jokaiselle tauluko alkiolle. Algoritmi loppuosa aikakompleksisuus o siis luokkaa O( ja algoritmi kokoaiskompleksisuus luokkaa O( lg(. Yllä maiittu algoritmi o implemetoitu C- ja Pytho-kielillä likitettyihi kooditiedostoihi. Lajittelumetodiksi voi valita kekolajittelu tai kirjasto Quicksortlajittelu.
Tehtävä 4.4 Kirjoita ohjelma (joko C- tai Pytho-kielellä, jolla voidaa testata lajittelualgoritmie suoritusaikoja. Kirjoita fuktiot, jotka suorittavat kekolajittelu ja pikalajittelu (Quicksort ja testaa äide suoritusaikoja erikokoisilla kokoaislukutaulukoilla, jotka alustetaa satuaisluvuilla. Algoritmit ovat liitteeä tehtävie jälkee. Ylimääräie tehtävä. Mikäli aikaa jää, testaa vielä seuraavaa: Pikalajittelua voi yrittää parataa site, että lajittelee tauluko esi karkeaa suuruusjärjestyksee Quicksortalgoritmilla site, että rekursiivista Quicksort-kutsua ei tehdä, mikäli lajiteltava väli pituus o jotaki kyysarvoa pieempi. Liitteeä o tällaie algoritmi (QuicksortCutoff. Tällöi taulukkoo jää kyysarvoa lyhempiä välejä, jotka eivät ole järjestyksessä, mutta edellise osaväli arvot ovat pieempiä kui seuraava. Tällöi taulukko voidaa opeasti lajitella loppuu käyttäe lisäyslajittelua. Implemetoi tämä ja testaa aiaki kyysarvoilla 1, 5 ja 1. Nopeutuuko lajittelu puhtaasee Quicksortlajitteluu verrattua? Ratkaisu. Esimerkkiohjelmat C- ja Pytho-kielillä o likitetty ohee. Sekä kekolajittelu että Quicksorti aikakompleksisuus o luokkaa Θ(lg(. Tosi Quicksorti huooimma tapaukse aikakompleksisuus o luokkaa Θ( 2, mutta Quicksort toimii kuiteki keskimääri 2-5 kertaa opeammi kui kekolajittelu. Testikoeella saatii seuraavia suoritusaikoja kekolajittelulle: Kekolajittelu: C-ohjelma Tauluko koko 2 5 1 2 Aika (s.125.1.56 1.2 Kekolajittelu: Pytho-ohjelma Tauluko koko 2 5 1 2 Aika (s.25.74 1.5.47 Quicksort-algoritmi osoittautui vajaa kolme kertaa opeammaksi kui kekolajittelu. C-kielisellä ohjelmalla algoritmi suoriutui kohtuudella vielä taulukoista, joide koko oli 5. Yhdistelmäalgoritmi toimi hiema opeammi. Paras kyysarvo kokeilluista oli, tosi erot eivät olleet suuret Quicksort: C-ohjelma Tauluko koko 2 5 1 2 Aika (s.5.125.25.5 Quicksort+lisäyslajittelu, kyysarvo 1: C-ohjelma Tauluko koko 2 5 1 2 Aika (s.46.19.2.5 Quicksort+lisäyslajittelu, kyysarvo : C-ohjelma Tauluko koko 2 5 1 2 Aika (s.47.19.219.5 Quicksort+lisäyslajittelu, kyysarvo 5: C-ohjelma Tauluko koko 2 5 1 2 Aika (s.46.125.24.5
Pytho-ohjelmassa Quicksorti ja lisäyslajittelu yhdistelmä suoritusaikaa vaikutti voimakkaasti se, kuika suurelta lukuväliltä satuaislukuja arvottii. Tämä oki luoollista, koska tauluko kokoo ähde piei lukuväli aiheuttaa se, että taulukkoo arvotaa samoja lukuja. Tällöi taulukko o hyvi lähellä järjestettyä taulukkoa jo keskeytety Quicksorti jälkee. Alla aetuissa suoritusajoissa o arvottu satuaislukuja väliltä [1,1] : Quicksort: Pytho-ohjelma Tauluko koko 2 5 1 2 Aika (s 1.6.8 9.5 22.1 Quicksort+lisäyslajittelu, kyysarvo 1: Pytho -ohjelma Tauluko koko 2 5 1 2 Aika (s 1.27.26 7.4 2. Quicksort+lisäyslajittelu, kyysarvo : Pytho-ohjelma Tauluko koko 2 5 1 2 Aika (s 1.4.44 7.8 14.7 Quicksort+lisäyslajittelu, kyysarvo 5: Pytho-ohjelma Tauluko koko 2 5 1 2 Aika (s 1.46.81 8.1 16. Käytetyt ohjelmakoodit o likitetty ratkaisutiedosto alle.