Algoritmit 1. Demot Timo Männikkö

Samankaltaiset tiedostot
Algoritmit 1. Demot Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 1 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

11. Javan toistorakenteet 11.1

Algoritmit 1. Luento 5 Ti Timo Männikkö

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

58131 Tietorakenteet ja algoritmit (syksy 2015)

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen)

Ohjelmoinnin peruskurssi Y1

Nopea kertolasku, Karatsuban algoritmi

Algoritmit 2. Luento 13 Ti Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Algoritmit 2. Luento 10 To Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

LUKUTEORIA johdantoa

Algoritmit 2. Luento 9 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 2. Luento 11 Ti Timo Männikkö

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Tietorakenteet, laskuharjoitus 2,

Algoritmit 2. Luento 8 To Timo Männikkö

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 2 Ke Timo Männikkö

Tekijä Pitkä Matematiikka 11 ratkaisut luku 2

Python-ohjelmointi Harjoitus 5

Valitse kuusi tehtävää! Kaikki tehtävät ovat 6 pisteen arvoisia.

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Algoritmit 2. Luento 12 To Timo Männikkö

1.4 Funktioiden kertaluokat

Tarkennamme geneeristä painamiskorotusalgoritmia

Java-kielen perusteet

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmoinnin perusteet Y Python

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 2. Luento 10 To Timo Männikkö

Python-ohjelmointi Harjoitus 2

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 1. Luento 14 Ke Timo Männikkö

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Java-kielen perusteet

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmoinnin perusteet Y Python

Merkkijonon tutkiminen matches-metodilla

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 2. Luento 11 Ti Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Tekijä MAA2 Polynomifunktiot ja -yhtälöt = Vastaus a)

Jaetun muistin muuntaminen viestin välitykseksi. 15. lokakuuta 2007

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

3. Muuttujat ja operaatiot 3.1

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Muuttujien roolit Kiintoarvo cin >> r;

Ohjelmoinnin peruskurssi Y1

Muistutus aikatauluista

1 Lukujen jaollisuudesta

9 Erilaisia tapoja järjestää

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

Transkriptio:

Algoritmit 1 Demot 1 25.-26.1.2017 Timo Männikkö

Tehtävä 1 (a) Algoritmi, joka laskee kahden kokonaisluvun välisen jakojäännöksen käyttämättä lainkaan jakolaskuja Jaettava m, jakaja n Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena Jäljelle jää jakojäännös Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 2/27

Tehtävä 1 (a) jatkuu int m, n; // oletetaan, että molemmat > 0 while (m >= n) { m = m - n; return m; // jakojäännös nyt muuttujassa m Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 3/27

Tehtävä 1 (b) Algoritmi, joka tutkii onko merkkijonossa jossain kohtaa kaksi samaa merkkiä peräkkäin Kaksi osoitinta c ja d Aluksi c merkkijonon alkuun Jos sitä seuraava merkki d on sama on Muuten siirrytään yksi askel eteenpäin ja tehdään uusi vertailu Jos c siirtyy merkkijonon loppuun ei ole Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 4/27

Tehtävä 1 (b) jatkuu string mjono; // oletetaan, että pituus > 0 c = ensimmainen(mjono); while (c!= viimeinen(mjono)) { d = seuraava(c); if (c == d) return true; // samat merkit peräkkäin c = d; return false; // ei löytynyt Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 5/27

Tehtävä 2 (a) Taulukossa on lukuja satunnaisessa järjestyksessä Algoritmi, joka laskee kuinka moni luvuista on suurempi kuin kaikkien lukujen keskiarvo Käydään taulukko läpi ja lasketaan keskiarvo Käydään taulukko läpi toisen kerran, verrataan jokaista lukua keskiarvoon ja lisätään tarvittaessa laskurin arvoa Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 6/27

Tehtävä 2 (a) jatkuu // taulukko t, koko n > 0 summa = 0; for (i = 0; i < n; i++) { summa = summa + t[i]; keskiarvo = summa/n; lkm = 0; for (i = 0; i < n; i++) { if (t[i] > keskiarvo) { lkm++; return lkm; // Suoritusaika: // silmukka n kertaa // joka kierroksella // silmukka n kertaa // joka kierroksella // vain tarvittaessa Suoritusaika muotoa T (n) = n t 1 + t 2 = O(n) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 7/27

Tehtävä 2 (b) Taulukossa on lukuja suuruusjärjestyksessä Algoritmi, joka pakkaa taulukon siten, että kutakin eri lukua jää taulukkoon vain yksi kappale Muuttuja j osoittaa viimeisimpään eri lukuun Muuttuja i käy läpi taulukon loput luvut Jos i ja j osoittavat samansuuruiseen lukuun, j ei muutu Muuten j kasvaa yhdellä ja i:n kohdalla oleva luku kopioidaan j:n kohdalle Näin duplikaatit korvautuvat uusilla luvuilla Lopulta pakattu taulukko koostuu alkuperäisen taulukon alkuosasta Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 8/27

Tehtävä 2 (b) jatkuu // taulukko t, koko n > 0 j = 0; for (i = 1; i < n; i++) { if (t[i]!= t[j]) { j++; if (i!= j) t[j] = t[i]; n = j + 1; // uusi koko // Suoritusaika: // silmukka n-1 kertaa // joka kierroksella // vain tarvittaessa // vain tarvittaessa Suoritusaika muotoa T (n) = n t 1 + t 2 = O(n) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 9/27

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 2017 Demot 1 25.-26.1.2017 10/27

Tehtävä 3 jatkuu Tarkempi perustelu laskemalla raja-arvot: Tiedetään, että f (n) ja g(n) ovat samaa kertaluokkaa, jos lim n f (n) g(n) = C 0 Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 11/27

Tehtävä 3 (a) f (n) = 4n 5 + 8n 3 + 16n lim n 4n 5 + 8n 3 + 16n n 5 = lim n ( 4 + 8 n + 16 ) 2 n 4 = 4 f (n) = O(n 5 ) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 12/27

Tehtävä 3 (b) f (n) = 1000 + 10 n + n lim n 1000 + 10 n + n n = lim n ( 1000 n + 10 ) + 1 n = 1 f (n) = O(n) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 13/27

Tehtävä 3 (c) f (n) = n 3 + 2 n lim n n 3 + 2 n 2 n = lim n ( ) n 3 2 + 1 n = 1 f (n) = O(2 n ) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 14/27

Tehtävä 3 (d) f (n) = 2 log 2 n + 5n lim n 2 log 2 n + 5n n = lim n ( 2 log 2 n n ) + 5 = 5 f (n) = O(n) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 15/27

Tehtävä 3 (e) f (n) = 2n log 2 n + 5n lim n 2n log 2 n + 5n n log 2 n = lim n ( 2 + 5 ) log 2 n = 2 f (n) = O(n log 2 n) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 16/27

Tehtävä 3 (f) f (n) = 2n/ log 2 n + 5n lim n 2n/ log 2 n + 5n n = lim n ( ) 2 log 2 n + 5 = 5 f (n) = O(n) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 17/27

Tehtävä 4 Neljä algoritmia, joiden laskutoimitusten lukumäärät: 50n, 1 2 n2, 4n 3, 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 2017 Demot 1 25.-26.1.2017 18/27

Tehtävä 4 (a) Minuutti = 60 000 ms N = 60 000 kpl 50n = N n = N/50 = 1 200 1 200 1 2 n2 = N n = 2N 346.4 346 4n 3 = N n = 3 N/4 24.7 24 2 n = N n = log 2 N = ln N/ ln 2 15.9 15 Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 19/27

Tehtävä 4 (b) Laskutoimitusten lkm kasvaa 10-kertaiseksi Merkitään n old = m = 10 000 50n = 10 50m n = 10m = 100 000 100 000 1 2 n2 = 10 1 2 m2 n = 10m 31 622.8 31 622 4n 3 = 10 4m 3 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 2017 Demot 1 25.-26.1.2017 20/27

Tehtävä 5 (a) for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { c[i][j] = 0; for (k = 0; k < n; k++) { c[i][j] += a[i][k]*b[k][j]; // silmukka n kertaa // silmukka n kertaa // silmukka n kertaa // Sisimmän silmukan sisältö n n n kertaa O(n 3 ) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 21/27

Tehtävä 5 (b) for (i = 1; i < n; i++) { for (j = n-2; j >= i-1; j--) { if (t[j+1] < t[j]) { swap(t[j], t[j+1]); Sisemmän silmukan sisältö suoritetaan n 1 (n 1)n (n i) = (n 1)n 2 i=1 kertaa O(n 2 ) // silmukka n-1 kertaa // silmukka n-i kertaa // tod.näk. vakio = 1 2 n2 1 2 n Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 22/27

Tehtävä 5 (b) jatkuu for (i = 1; i < n; i++) { for (j = n-2; j >= i-1; j--) { if (t[j+1] < t[j]) { swap(t[j], t[j+1]); // silmukka n-1 kertaa // silmukka n-i kertaa // tod.näk. vakio Aliohjelmakutsu on sisemmässä silmukassa Suoritetaan pahimmassa tapauksessa 1 2 n2 1 2 n = O(n2 ) kertaa Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 23/27

Tehtävä 5 (c) for (i = 0; i < n-1; i++) { k = i; for (j = i+1; j < n; j++) { if (t[j] < t[k]) k = j; if (k!= i) swap(t[i], t[k]); // silmukka n-1 kertaa // silmukka n-1-i kertaa // tod.näk. vakio // Sisemmän silmukan sisältö suoritetaan n 2 (n 1 i) = (n 1) 2 (n 2)(n 1) 2 i=0 kertaa O(n 2 ) = 1 2 n2 1 2 n Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 24/27

Tehtävä 5 (c) jatkuu for (i = 0; i < n-1; i++) { k = i; for (j = i+1; j < n; j++) { if (t[j] < t[k]) k = j; if (k!= i) swap(t[i], t[k]); // silmukka n-1 kertaa // silmukka n-1-i kertaa // tod.näk. vakio // Aliohjelmakutsu on ulommassa silmukassa Suoritetaan pahimmassakin tapauksessa vain n 1 = O(n) kertaa Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 25/27

Tehtävä 5 (d) for (i = 0; i < n; i++) { if (i%2!= 0) { for (j = i; j < n; j++) a = a + 5; for (j = 0; j <= i; j++) b = b - 20; // silmukka n kertaa // silmukka n-i kertaa // silmukka i+1 kertaa // (j-silmukat vain // jos i pariton) Molemmat j-silmukat suoritetaan vain jos i on pariton, ts. vain joka toisella i-silmukan kierroksella Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 26/27

Tehtävä 5 (d) jatkuu Sisempien silmukoiden sisällöt suoritetaan tai n 2 (n i + i + 1) = 1 2 n2 + 1 n (jos n parillinen) 2 n 1 2 (n i + i + 1) = 1 2 n2 1 2 kertaa O(n 2 ) (jos n pariton) Algoritmit 1 Kevät 2017 Demot 1 25.-26.1.2017 27/27