Algoritmit 1 Demot 1 31.1.-1.2.2018 Timo Männikkö
Tehtävä 1 (a) Algoritmi, joka tutkii onko kokonaisluku tasan jaollinen jollain toisella kokonaisluvulla siten, että ei käytetä lainkaan jakolaskuja Jaettava m, jakaja n Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena Jos jäljelle jää nolla, jaettava oli tasan jaollinen Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 2/25
Tehtävä 1 (a) jatkuu int m, n; // oletetaan, että molemmat > 0 while (m >= n) { m = m - n; if (m == 0) return true; else return false; Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 3/25
Tehtävä 1 (b) Algoritmi, joka laskee montako samaa merkkiä merkkijonon alussa on peräkkäin Lasketaan lukumäärää laskuriin Aluksi osoitin c merkkijonon alkuun Siirretään c:tä yhdellä askeleella eteenpäin ja verrataan ensimmäiseen merkkiin Jatketaan kunnes tulee eri merkki tai kunnes merkkijono loppuu Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 4/25
Tehtävä 1 (b) jatkuu string mjono; // oletetaan, että pituus > 0 laskuri = 1; // ainakin yksi sama merkki c = ensimmainen(mjono); while (c!= viimeinen(mjono) { c = seuraava(c); if (c == ensimmainen(mjono)) laskuri = laskuri + 1; else break; // lopetetaan silmukka return laskuri; Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 5/25
Tehtävä 2 (a) Taulukossa on lukuja satunnaisessa järjestyksessä Algoritmi, joka laskee taulukon suurimman ja pienimmän luvun välisen erotuksen Käydään taulukko läpi ja etsitään sekä suurin että pienin luku Lasketaan erotus Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 6/25
Tehtävä 2 (a) jatkuu // taulukko t, koko n > 0 suurin = t[0]; pienin = t[0]; for (i = 1; i < n; i++) { if (t[i] > suurin) suurin = t[i]; if (t[i] < pienin) pienin = t[i]; erotus = suurin - pienin; // Suoritusaika: // silmukka n-1 kertaa // joka kierroksella // vain tarvittaessa // joka kierroksella // vain tarvittaessa Suoritusaika muotoa T (n) = n t 1 + t 2 = O(n) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 7/25
Tehtävä 2 (b) Taulukossa on positiivisia lukuja suuruusjärjestyksessä Algoritmi, joka nollaa kaikki duplikaatit Lisäksi lasketaan nollattujen lukujen lukumäärä Muuttuja j osoittaa viimeisimpään eri lukuun Muuttuja i käy läpi taulukon loput luvut Jos i ja j osoittavat samansuuruiseen lukuun, paikka i nollataan ja j ei muutu Muuten j siirtyy i:n kohdalle Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 8/25
Tehtävä 2 (b) jatkuu // taulukko t, koko n > 0 j = 0; laskuri = 0; for (i = 1; i < n; i++) { // Suoritusaika: // silmukka n-1 kertaa if (t[i] == t[j]) { // joka kierroksella t[i] = 0; // vain tarvittaessa laskuri++; // vain tarvittaessa else j = i; // vain tarvittaessa // nollien lukumäärä on nyt muuttujassa laskuri Suoritusaika muotoa T (n) = n t 1 + t 2 = O(n) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 9/25
Tehtävä 3 Funktioiden asymptoottiset ylärajat: Kertaluokan määrää termi, joka kasvaa nopeimmin kun n kasvaa Joidenkin peruskertaluokkien suuruusjärjestys on log 2 n, n, n log 2 n, n 2, n 3, 2 n Yleisesti n k kasvaa sitä nopeammin mitä suurempi k on Pätee myös kun k ei ole kokonaisluku, toisin sanoen n = n 1/2 on kertaluokaltaan pienempi kuin n Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 10/25
Tehtävä 3 jatkuu Tarkempi perustelu laskemalla raja-arvot: Tiedetään, että f (n) ja g(n) ovat samaa kertaluokkaa, jos lim f (n) g(n) = C 0 Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 11/25
Tehtävä 3 (a) f (n) = 3n 5 + 3n 3 + 24n lim 3n 5 + 3n 3 + 24n n 5 = lim ( 3 + 3 n + 24 ) 2 n 4 = 3 f (n) = O(n 5 ) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 12/25
Tehtävä 3 (b) f (n) = 800 + 50 n + 3n lim 800 + 50 n + 3n n = lim ( 800 n + 50 ) + 3 n = 3 f (n) = O(n) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 13/25
Tehtävä 3 (c) f (n) = 4n 3 + 2 n lim 4n 3 + 2 n 2 n = lim ( ) 4n 3 2 + 1 n = 1 f (n) = O(2 n ) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 14/25
Tehtävä 3 (d) f (n) = 4 log 2 n + 10n lim 4 log 2 n + 10n n = lim ( 4 log2 n n ) + 10 = 10 f (n) = O(n) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 15/25
Tehtävä 3 (e) f (n) = 3n log 2 n + 5n lim 3n log 2 n + 5n n log 2 n = lim ( 3 + 5 ) log 2 n = 3 f (n) = O(n log 2 n) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 16/25
Tehtävä 3 (f) f (n) = 2n/ log 2 n + n lim 2n/ log 2 n + n n = lim ( ) 2 log 2 n + 1 = 1 f (n) = O(n) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 17/25
Tehtävä 4 Neljä algoritmia, joiden laskutoimitusten lukumäärät: 25n, 5n 2, 1 2 n3, 2 n (a) (b) Yksi laskutoimitus kestää 1 ms (= 10 3 s) Minkä kokoinen tehtävä minuutissa? Tietyssä ajassa tehtävä, jonka koko 10 000 Nopeus kasvaa 10-kertaiseksi Minkä kokoinen tehtävä samassa ajassa? Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 18/25
Tehtävä 4 (a) Minuutti = 60 000 ms N = 60 000 kpl 25n = N n = N/25 = 2 400 2 400 5n 2 = N n = N/5 109,5 109 1 2 n3 = N n = 3 2N 49,3 49 2 n = N n = log 2 N = ln N/ ln 2 15,9 15 Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 19/25
Tehtävä 4 (b) Laskutoimitusten lkm kasvaa 10-kertaiseksi Merkitään n old = m = 10 000 25n = 10 25m n = 10m = 100 000 100 000 5n 2 = 10 5m 2 n = 10m 31 622,8 31 622 1 2 n3 = 10 1 2 m3 n = 3 10m 21 544,3 21 544 2 n = 10 2 m n = log 2 10 + m 10 003,3 10 003 Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 20/25
Tehtävä 5 (a) d = 0; for (i = 0; i < n; i++) { c[i] = 0; for (j = 0; j < n; j++) { c[i] += a[i][j]*b[j]; d += b[i]*c[i]; // silmukka n kertaa // silmukka n kertaa Sisimmän silmukan sisältö suoritetaan n n kertaa O(n 2 ) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 21/25
Tehtävä 5 (b) for (i = 0; i < n; i++) { if (i%2 == 0) { for (j = 0; j <= i; j++) a = 2*a; for (j = i; j < n; j++) b = b/2; // silmukka n kertaa // silmukka i+1 kertaa // silmukka n-i kertaa // (j-silmukat vain // jos i parillinen) Molemmat j-silmukat suoritetaan vain jos i on parillinen, ts. vain joka toisella i-silmukan kierroksella Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 22/25
Tehtävä 5 (b) jatkuu Sisempien silmukoiden sisällöt suoritetaan tai n 2 (i + 1 + n i) = 1 2 n2 + 1 n (jos n parillinen) 2 n + 1 2 (i + 1 + n i) = 1 2 n2 + n + 1 2 kertaa O(n 2 ) (jos n pariton) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 23/25
Tehtävä 5 (c) for (i = 1; i < n; i++) { for (j = n-1; j >= i; j--) { if (t[j] < t[j-1]) { swap(t[j-1], t[j]); // silmukka n-1 kertaa // silmukka n-i kertaa // tod.näk. vakio Sisemmän silmukan sisältö suoritetaan n 1 i=1 (n i) = (n 1)n (n 1)n 2 = 1 2 n2 1 2 n kertaa O(n 2 ) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 24/25
Tehtävä 5 (d) for (i = 1; i < n; i++) { k = 0; p = t[i]; for (j = i-1; j >= 0; j--) { if (t[j] <= p) leap(j, k); t[j+1] = t[j]; t[k] = p; i=1 // silmukka n-1 kertaa // silmukka i kertaa // tod.näk. vakio Sisemmän silmukan sisältö suoritetaan n 1 (n 1)n i = = 1 2 2 n2 1 2 n kertaa O(n 2 ) Algoritmit 1 Kevät 2018 Demot 1 31.1.-1.2.2018 25/25