Algoritmit 2 Luento 8 To 4.4.2019 Timo Männikkö
Luento 8 Algoritmien analysointi Algoritmien suunnittelu Rekursio Osittaminen Rekursioyhtälöt Rekursioyhtälön ratkaiseminen Master-lause Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 2/31
Algoritmien analysointi Määritellään ohjelman/algoritmin yksittäisten käskyjen/askelien asymptoottinen vaativuus Yhdistetään peräkkäin suoritettavien käskyjen/askelien vaativuudet Huomioidaan silmukat, ehtolauseet ja muut rakenteet Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 3/31
Perusoperaatiot Sijoituslause: Yleensä vakioaika Θ(1) Peräkkäiset lauseet: Lasketaan yhteen yksittäisten lauseiden suoritusaika Ehtolause: Ehtolausekkeen suoritusaika + ehdollisesti suoritetun lauseen maksimisuoritusaika Silmukka: Silmukkalauseen lausekkeiden suoritusaika + silmukan rungon suoritusaika summattuna yli silmukan suorituskertojen Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 4/31
Aliohjelmat Selvitetään alimman tason aliohjelmien suoritusaika (eivät sisällä aliohjelmakutsuja) Selvitetään seuraavan tason aliohjelmien suoritusaika (sisältävät vain sellaisten aliohjelmien kutsuja, joiden suoritusaika jo selvitetty) Jatketaan kunnes kaikkien aliohjelmien suoritusajat selvitetty Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 5/31
Algoritminen ongelmanratkaisu Tutkitaan tehtävän tai ongelman kuvaus Käydään läpi esimerkkitapauksia Jos ongelma voidaan muuntaa joksikin tunnetuksi ongelmaksi, sille saattaa löytyä valmiita ratkaisumenetelmiä Otetaan huomioon ratkaisuympäristön asettamat rajoitukset Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 6/31
Algoritminen ongelmanratkaisu Käytetään hyviksi osoittautuneita algoritmien suunnittelumenetelmiä Algoritmin kuvaus Sanallinen, pseudokoodi Algoritmin analysointi Aikavaativuus, muiden resurssien käyttö Algoritmin toteutus Koodaus, testaus Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 7/31
Algoritmien suunnittelumenetelmät Yleisiä tekniikoita ja periaatteita algoritmin muodostamiseksi Joskus algoritmi voidaan katsoa kuuluvan usean eri suunnittelumenetelmän mukaiseksi Joskus algoritmin ei voida katsoa kuuluvan mihinkään erityiseen suunnittelumenetelmäluokkaan Monesti algoritmi käyttää hyväksi ongelman erityisominaisuuksia Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 8/31
Rekursio Algoritmi kutsuu itseään ratkaisun aikana Pienempi ongelma usein helpommin ratkaistavissa kuin samanlainen mutta suurempi ongelma Monille vaikeille ongelmille löytyy yksinkertainen rekursiivinen ratkaisumenetelmä Mutta rekursion käyttö voi joissain tapauksissa johtaa tehottomiin algoritmeihin Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 9/31
Osittaminen Ositetaan eli jaetaan ongelma pienempiin vastaavanlaisiin osaongelmiin Ratkaistaan osaongelmat Muodostetaan osaongelmien ratkaisuista alkuperäisen ongelman ratkaisu Osaongelmat tyypiltään samanlaisia kuin alkuperäinen ongelma Osaongelmat voidaan ratkaista samalla tavalla Rekursio Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 10/31
Rekursio ja ositus Oltava lopetusehto, jotta rekursio päättyy joskus Yleensä ositus kannattaa tehdä siten, että osaongelmat ovat keskenään suunnilleen samankokoisia Joissain tapauksissa on mahdollista, että osaongelmat eivät ole täysin erillisiä Kaikkia osaongelmia ei tarvitse aina ratkaista Riippuu tehtävästä, ratkaisuprosessin etenemisestä Ratkaisun muodostaminen osaongelmien ratkaisuista Riippuu tehtävästä Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 11/31
Osittava ja rekursiivinen algoritmi Algoritmin kutsu annetulla ongelmalla: Jos riittävän pieni tai yksinkertainen ongelma Ratkaistaan se (ei-rekursiivisesti) ja palautetaan ratkaisu Muuten jaetaan ongelma pienempiin vastaavanlaisiin ongelmiin Ratkaistaan ne rekursiivisilla kutsuilla Muodostetaan pienempien ongelmien ratkaisuista tämän kutsun ongelman ratkaisu ja palautetaan se Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 12/31
Esimerkki: Hanoin torni Kolme tankoa, n erikokoista kiekkoa Aluksi kaikki kiekot yhdessä tangossa suuruusjärjestyksessä Tehtävänä siirtää kaikki kiekot toiseen tankoon Siirretään vain yhtä kiekkoa kerrallaan Suurempaa kiekkoa ei saa siirtää pienemmän kiekon päälle Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 13/31
Hanoin torni: Ratkaisu Siirretään lähdetangosta n 1 kiekkoa aputankoon Siirretään lähdetankoon jäänyt suurin kiekko kohdetankoon Siirretään aputangossa olevat n 1 kiekkoa kohdetankoon Algoritmia kutsutaan rekursiivisesti Rekursio päättyy kun siirrettävänä on vain yksi kiekko Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 14/31
Hanoin torni: Algoritmi torni(lukumäärä, lähde, kohde, apu) { if (lukumäärä == 1) siirretään kiekko lähdetangosta kohdetankoon; else if (lukumäärä > 1) { torni(lukumäärä-1, lähde, apu, kohde); torni(1, lähde, kohde, apu); torni(lukumäärä-1, apu, kohde, lähde); } } Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 15/31
Hanoin torni: Aikavaativuus Siirtojen lukumäärä s(n), kun kiekkoja n kappaletta Jos n = 1, niin s(n) = 1 Jos n > 1, niin s(n) = s(n 1) + s(1) + s(n 1) = 2s(n 1) + 1 Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 16/31
Hanoin torni: Aikavaativuus s(n) = 2s(n 1) + 1 = 2 1 s(n 1) + 2 0 = 2[2s(n 2) + 1] + 1 = 4s(n 2) + 2 + 1 = 2 2 s(n 2) + 2 1 + 2 0 = 4[2s(n 3) + 1] + 2 + 1 =... = 2 n 1 s(1) + = 2 n 1 + 2 n 1 1 = 2 n 1 Eksponentiaalinen! n 2 j=0 2 j Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 17/31
Rekursioyhtälöt Ongelma, jonka koko on n, jaetaan a:han osaongelmaan, joiden koko on n/b Osaongelmat ratkaistaan rekursiivisesti Lisäksi muu aika: Osaongelmien muodostaminen, ratkaisujen kokoaminen Rekursioyhtälö { c 1, kun n = 1 T (n) = at (n/b) + d(n), kun n = b k, k 1 Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 18/31
Rekursioyhtälön ratkaiseminen T (n) = T (b k ) = at (b k 1 ) + d(b k ) = a[at (b k 2 ) + d(b k 1 )] + d(b k ) = a 2 T (b k 2 ) + ad(b k 1 ) + d(b k ) = a 2 [at (b k 3 ) + d(b k 2 )] + ad(b k 1 ) + d(b k ) = a 3 T (b k 3 ) + a 2 d(b k 2 ) + ad(b k 1 ) + d(b k ) =... = a k T (b 0 ) + }{{} =T (1)=c 1 k 1 j=0 a j d(b k j ) Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 19/31
Rekursioyhtälön ratkaiseminen Erikoistapaus d(n) = cn α : T (n) = c 1 a k + = c 1 a k + k 1 j=0 k 1 j=0 k 1 = c 1 a k + cb αk a j d(b k j ) a j cb α(k j) j=0 ( a b α ) j Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 20/31
Rekursioyhtälön ratkaiseminen Oletetaan ensin, että a b α : k 1 T (n) = c 1 a k + cb αk j=0 ( a b α ) j = c 1 a k + cb αk (a/bα ) k 1 (a/b α ) 1 = c 1 a k + c ak b αk (a/b α ) 1 Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 21/31
Rekursioyhtälön ratkaiseminen T (n) = c 1 a k + c ak b αk (a/b α ) 1 = c 1 a log b n + c alog b n n α (a/b α ) 1 = c 1 n log b a + c nlog b a n α (a/b α ) 1 (k = log b n) (a log b n = n log b a ) Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 22/31
Rekursioyhtälön ratkaiseminen T (n) = c 1 n log b a + c nlog b a n α (a/b α ) 1 Jos c = 0, kertaluokka n log b a Muuten kertaluokka joko n log b a tai n α riippuen siitä, kumpi eksponentti on suurempi log b a > α a > b α log b a < α a < b α Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 23/31
Rekursioyhtälön ratkaiseminen Lisäksi tapaus a = b α ja c 0: k 1 T (n) = c 1 a k + cb αk j=0 = c 1 b αk + cb αk k = c 1 n α + cn α log b n ( a b α ) j Kertaluokka n α log b n Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 24/31
Master-lause Rekursioyhtälön { c 1, kun n = 1 T (n) = at (n/b) + cn α, kun n = b k, k 1 ratkaisun kertaluokka on Θ(n log b a ), jos a > b α tai c = 0 Θ(n α ), jos a < b α ja c 0 Θ(n α log b n), jos a = b α ja c 0 Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 25/31
Esimerkki: Lomituslajittelu Oletus: Järjestettäviä alkioita n = 2 k Jaetaan järjestettävät alkiot kahteen osajoukkoon Osajoukoissa n/2 alkiota Osajoukot lajitellaan rekursiivisesti Rekursio lopetetaan, kun osajoukossa on yksi alkio Yhdistetään kahden järjestetyn osajoukon alkiot lomittamalla Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 26/31
Esimerkki: Lomituslajittelu Merge_sort(a, l, h) { if (l < h) { k = (l + h)/2; Merge_sort(a, l, k); Merge_sort(a, k+1, h); Merge(a, l, k, h); } } Merge(a, l, k, h) // Lomitetaan alkiot paikoissa l,..., k // ja k+1,..., h järjestykseen Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 27/31
Esimerkki: Lomituslajittelu T (n) = { c 1, kun n = 1 2T (n/2) + cn, kun n = 2 k, k 1 a = 2, b = 2, α = 1, c 0 Master-lauseen kolmas kohta T (n) = Θ(n log 2 n) Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 28/31
Esimerkki: Kokonaislukujen kertolasku Annettu n-bittisiä kokonaislukuja Oletus: n = 2 k jollain k 0 Kahden luvun yhteenlasku: Bitti kerrallaan Θ(n) Kertominen kakkosen potenssilla 2 m : Voidaan toteuttaa sivuttaissiirtona Θ(m) Kahden luvun kertolasku: Bitti kerrallaan ( peruskoulualgoritmilla ) Θ(n 2 ) Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 29/31
Esimerkki: Kokonaislukujen kertolasku Kokonaislukujen X ja Y kertolasku osittamalla Jaetaan X :n bitit: X = A 2 n/2 + B Jaetaan Y :n bitit: Y = C 2 n/2 + D Silloin XY = AC 2 n + [(A B)(D C) + AC + BD] 2 n/2 + BD 3 kpl kertolaskuja n/2-bittisillä luvuilla 2 kpl sivuttaissiirtoja 6 kpl yhteen- ja vähennyslaskuja Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 30/31
Esimerkki: Kokonaislukujen kertolasku T (n) = { c 1, kun n = 1 3T (n/2) + cn, kun n = 2 k, k 1 a = 3, b = 2, α = 1, c 0 Master-lauseen ensimmäinen kohta T (n) = Θ(n log 2 3 ) (log 2 3 1,58 < 2) Algoritmit 2 Kevät 2019 Luento 8 To 4.4.2019 31/31