Algoritmien analyysi - luentokalvot
Transcription
Algoritmien analyysi - luentokalvot
811312A Tietorakenteet ja algoritmit 2015 - 2016 II Algoritmien analyysi Sisältö 1. Algoritmien oikeellisuus 2. Algoritmien suorituskyvyn analyysi 3. Master Theorem Ari Vesanen 811312A TRA, Algoritmien analyysi 2 II.1. Algoritmien oikeellisuus Yksi osa algoritmien analyysistä Varmistaa, että algoritmi toimii oikein Osittainen oikeellisuus Jos algoritmi päättyy, se tuottaa oikean tuloksen Täydellinen oikeellisuus Algoritmi päättyy ja tuottaa oikean tuloksen Algoritmin oikeaksi todistaminen = Todistettava osittainen oikeellisuus ja algoritmin päättyminen Ari Vesanen 811312A TRA, Algoritmien analyysi 3 II.1.1 Algoritmin oikeaksi todistaminen Tällä kurssilla ei käytetä formaaleja menetelmiä Oikean tuloksen varmistaminen: käytetään väitteitä, jotka osoitetaan oikeaksi ja joista seuraa algoritmin oikeellisuus Usein invariantteja = ominaisuuksia, jotka ovat voimassa tietyssä kohdassa koko algoritmin suorituksen ajan Päättymisen varmistaminen: käytetään konvergentteja Yleensä arvoja, jotka pienenevät tai kasvavat ja päättävät algoritmin, kun saavat jonkun tietyn arvon Ari Vesanen 811312A TRA, Algoritmien analyysi 4 II.1.1.1 Esimerkki: Kolmen luvun maksimi Syöte: Luvut a,b Tulostus: Suurin MAKSIMI3(a,b,c) 1. x = a 2. if b > x 3. x = b 4. // VÄITE 1: 5. if c > x 6. x = c 7. // VÄITE 2: 8. return x Ari Vesanen ja c luvuista a,b ja c x = max(a,b) x = max(a,b,c) 811312A TRA, Algoritmien analyysi 5 II.1.1.2 Esimerkki: Taulukon arvojen minimi Syöte: Taulukko A[1,..,n], n >= 1 Tulostus: Pienin luvuista A[1], … , A[n] MINIMI(A) i on konvergentti 1. i = 2 2. x = A[1] Silmukkainvariantti: 3. while i <= n do 4. if A[i] < x Kun i=k, rivillä 3 muuttujan 5. x = A[i] x arvo on pienin taulukon 6. i = i+1 arvoista A[1], …, A[k-1] 7. return x Ari Vesanen 811312A TRA, Algoritmien analyysi 6 II.1.1.3 Esimerkki: Hanoin tornit Alkutilanne: 1 N kiekkoa Tavoite: 2 3 Säännöt: 1. Kiekkoja siirretään yksi kerrallaan paalusta toiseen 2. Vain pienemmän kiekon saa siirtää toisen päälle Keksi siirtosarjan tuottava algoritmi Ari Vesanen 811312A TRA, Algoritmien analyysi 7 II.1.1.3 Esimerkki: Hanoin tornit (2) Syöte: Luku N >= 1 ja paalujen numerot A, B ja C Tulostus: Siirtojärjestys N:lle kiekolle paalusta A paaluun B käyttämällä apuna paalua C SIIRRÄ(N,A,B,C) N on konvergentti 1. if N==1 2. tulosta A -> B Väite: Mistä tahansa laillisesta 3. else 4. SIIRRÄ(N-1,A,C,B) asemasta, jossa N pienintä kiekkoa 5. tulosta A -> B ovat paalussa A, algoritmi tulostaa 6. SIIRRÄ(N-1,C,B,A) laillisen siirtosarjan, missä nämä 7. return N pienintä kiekkoa paaluun B käyttäen apuna paalua C eikä siinä siirretä mitään muita kiekkoja. Ari Vesanen 811312A TRA, Algoritmien analyysi 8 II.1.1.4 Esimerkki: Lisäyslajittelu Syöte: Taulukko A[0,1, ..,n-1], n >= 1 Tulostus: Järjestys A[0] <= … <= A[n-1] Invariantti: Rivillä 1 alkiot A[0,…j-1] samat kuin alkup. INSERTION_SORT(A) taulukossa, mutta 1. for j = 1 to n-1 suuruusjärjestyksessä 2. k = A[j] A[0] <= … <= A[j-1] 3. i = j-1 4. while i>=0 and A[i]>k 5. A[i+1] = A[i] i on konvergentti: 6. i = i-1 while päättyy joka 7. A[i+1] = k for-kierroksella Ari Vesanen 811312A TRA, Algoritmien analyysi 9 II.2 Algoritmien suorituskyvyn analyysi Tällä kurssilla ollaan kiinnostuneita aikakompleksisuudesta = algoritmin vaatiman suoritusajan suhteesta algoritmin syötteen kokoon Tarvitaan abstrakti malli koneelle, joka suorittaa algoritmia Tässä käytetään hajasaantikonetta (random-access machine) Ari Vesanen 811312A TRA, Algoritmien analyysi 10 II.2.1 Hajasaantikone Samanlaisista muistipaikoista koostuva muisti Prosessori, jolla käytettävissään rekistereitä Dataa mielivaltaisista muistipaikoista rekistereihin Arvoja rekistereistä takaisin muistiin Rekistereissä loogisia ja aritmeettisia operaatioita Ohjelma käskyjoukko Em. muisti- ja aritmeettisia operaatioita Suoritusta ohjaavia kontrollikäskyjä Käskyt suoritetaan peräkkäin, ts. ei rinnakkaista suorittamista Ari Vesanen 811312A TRA, Algoritmien analyysi 11 II.2.1 Hajasaantikone (2) Kaikki perusoperaatiot vaativat saman ajan Eroaa reaalikoneista Reaalikoneissa on muitakin perusoperaatioita kuin hajasaantikoneessa Analyysitulokset silti yleensä melko hyviä reaalikoneillekin Ari Vesanen 811312A TRA, Algoritmien analyysi 12 II.2.2 Analyysi: Iteratiiviset algoritmit II.2.2.1 Esimerkki: taulukon summa HUOM! Tässä oletetaan, että koodiriveillä eri suoritusajat c1,c2,c3 Syöte: Taulukko A[1,..,n], n >= 1 Tulostus: Taulukon alkioiden summa SUMMA(A) 1. sum = 0 2. for j = 1 to n 3. sum = sum+A[j] 4. return sum Ari Vesanen kust. c1 c2 c3 suorituskerrat 1 n n 811312A TRA, Algoritmien analyysi 13 II.2.2.1 Esimerkki: taulukon summa (2) Saadaan suoritusajaksi c1 (c 2 c3 ) n Siis muotoa A·n + B Tällaisia algoritmeja sanotaan lineaarisiksi Voidaan suorittaa erittäin suurilla taulukoilla Ari Vesanen 811312A TRA, Algoritmien analyysi 14 II.2.2.2 Esimerkki: vaihtolajittelu HUOM! Tässä oletetaan, että koodiriveillä eri suoritusajat c1,c2,…,c6 Syöte: Taulukko A[1,..,n], n >= 1 Tulostus: Taulukon luvut järjestyksessä A[1] <= … <= A[n] VAIHTOLAJITTELU(A) 1. for i = 1 to n 2. for j = 1 to n 3. if i<j && A[i]>A[j] 4. x = A[i] kust. c1 c2 c3 c4 suorituskerrat n n∙n = n2 n2 t(i, j) i, j 5. A[i] = A[j] c5 t(i, j) i, j 6. A[j] = x c6 t(i, j) i, j t(i,j) = 1 , jos ehto A[i] > A[j] on tosi ja t(i,j) =0 muuten. Ari Vesanen 811312A TRA, Algoritmien analyysi 15 II.2.2.2 Esimerkki: vaihtolajittelu (2) Saadaan suoritusajaksi c1 n (c 2 c 3 ) n 2 (c 4 c 5 c 6 ) t(i, j) i, j Riippuu taulukon alkuperäisestä järjestyksestä Paras tapaus c1 n (c 2 c 3 ) n 2 Huonoin tapaus n 2 (c2 c3 (c4 c5 c6 )/2) n (c1 - (c4 c5 c6 )/2) Keskimääräinen tapaus n 2 (c2 c3 (c4 c5 c6 )/4) n (c1 - (c4 c5 c6 )/4) Ari Vesanen 811312A TRA, Algoritmien analyysi 16 II.2.2.2 Esimerkki: vaihtolajittelu (4) Parannettu versio: Syöte: Taulukko A[1,..,n], n >= 1 Tulostus: Luvut järjestyksessä A[1] <= … <= A[n] VAIHTOLAJITTELU2(A) 1. for i = 1 to n-1 2. for j = i+1 to n 3. if A[i] > A[j] 4. x = A[i] 5. A[i] = A[j] 6. A[j] = x Ari Vesanen 811312A TRA, Algoritmien analyysi 17 II.2.2.2 Esimerkki: vaihtolajittelu (5) Parannettu algoritmi noin puolet nopeampi kuin alkuperäinen Suoritusaika silti luokkaa A·n2 + B·n Parantuiko oleellisesti? Tällaiset algoritmit neliöllisiä Suoritusaika pitkä erittäin suurilla taulukoilla Ari Vesanen 811312A TRA, Algoritmien analyysi 18 II.2.3 Analyysi: Asymptoottinen merkintätapa Työlästä (ja useimmiten vaikeaa) laskea tarkkaa suoritusaikaa -> Samaistetaan suoritusajat, jotka ovat samaa luokkaa Esim. ajat 2n+3 ja 7n+9 samaa luokkaa Esim. ajat 5n2 + 2n ja 21n2 + n samaa luokkaa Kummassakin tapauksessa aikafunktiot kasvavat samalla tavalla Aikakompleksisuuden käsittelyssä Käytetään ns. asymptoottista tarkastelua Käytettävät merkinnät: O-merkintä, Θ-merkintä ja merkintä Ari Vesanen 811312A TRA, Algoritmien analyysi 19 II.2.3 Analyysi: Asymptoottinen merkintätapa II.2.3.1 O-merkintä Olkoon g(n) jokin funktio. Silloin O(g(n)) on niiden funktioiden joukko, joita voidaan rajoittaa ylhäältä funktiolla g: O( g (n)) { f (n) On olemassa sellaiset positiiviset vakiot c ja n0 , että 0 f (n) c g (n), aina kun n n0 } Funktio g on funktion f asymptoottinen yläraja Merkitään f(n) Є O(g(n)) HUOM! Cormenin kirjassa epätarkasti f(n) = O(g(n)) Ari Vesanen 811312A TRA, Algoritmien analyysi 20 c∙g(n) f(n) n0 Funktion f kasvua voidaan ylhäältä rajoittaa funktiolla g, joten f(n) Є O(g(n)) II.2.3.1 O-merkintä (2) Esimerkkejä: f(n) = 2n2 + 3n f(n) Є O(n2), f(n) Є O(n3), f(n) Є O(n) f(n) = n lg(n) f(n) Є O(n2) Ari Vesanen 811312A TRA, Algoritmien analyysi 22 II.2.3.2 -merkintä Olkoon g(n) jokin funktio. Silloin (g(n)) on niiden funktioiden joukko, joita voidaan rajoittaa sekä ylhäältä että alhaalta funktiolla g: ( g (n)) { f (n) On olemassa sellaiset positiiviset vakiot c1 , c2 ja n0 , että c1 g (n) f (n) c2 g (n), aina kun n n0 } Funktio g asymptoottisesti tarkka raja funktiolle f Merkitään f(n) Є (g(n)) HUOM! Cormenin kirjassa epätarkasti f(n) = (g(n)) Ari Vesanen 811312A TRA, Algoritmien analyysi 23 c2∙g(n) f(n) c1∙g(n) n0 Funktion f kasvua voidaan ylhäältä ja alhaalta rajoittaa funktiolla g, joten f(n) Є (g(n)) II.2.3.2 -merkintä (2) Esimerkkejä: f(n) = 2n2 + 3n f(n) Є (n2), f(n) Є (n3), vaikka f(n) Є O(n3) f(n) = n lg(n) f(n) Є (n2), vaikka f(n) Є O(n2) Ari Vesanen 811312A TRA, Algoritmien analyysi 25 II.2.3.3 -merkintä Olkoon g(n) jokin funktio. Silloin (g(n)) on niiden funktioiden joukko, joita voidaan rajoittaa alhaalta funktiolla g: ( g (n)) { f (n) On olemassa sellaiset positiiviset vakiot c ja n0 , että 0 c g (n) f (n), aina kun n n0 } Funktio g on funktion f asymptoottinen alaraja Merkitään f(n) Є (g(n)) HUOM! Cormenin kirjassa epätarkasti f(n) = (g(n)) Ari Vesanen 811312A TRA, Algoritmien analyysi 26 f(n) c∙g(n) n0 Funktion f kasvua voidaan alhaalta rajoittaa funktiolla g, joten f(n) Є (g(n)) II.2.3.4 Merkintöjen ominaisuuksia Kaikki merkinnät transitiivisia: Jos f (n) O( g (n)) ja g (n) O(h(n)), niin f (n) O(h(n)) Jos f (n) ( g (n)) ja g (n) (h(n)), niin f (n) (h(n)) Jos f (n) ( g (n)) ja g (n) (h(n)), niin f (n) (h(n)) Ari Vesanen 811312A TRA, Algoritmien analyysi 28 II.2.3.5 Esimerkki: vaihtolajittelu Aiemmassa vaihtolajitteluesimerkissä aikakompleksisuus kaikissa tapauksissa luokkaa Θ(n2) Parannettu algoritmi noin puolet nopeampi kuin alkuperäinen: kompleksisuus silti luokkaa Θ(n2) Ei siis parantunut olennaisesti kun tarkastellaan asymptoottisesti HUOM! Jos tarkastellaan vain aikakompleksisuusluokkaa, ei kustannuksilla c1, …, c6 ole merkitystä! Seuraus: Voidaan olettaa vakiokestoiset operaatiot samanarvoisiksi -> Tarkastelu helpottuu Ari Vesanen 811312A TRA, Algoritmien analyysi 29 II.2.3.5 Esimerkki: vaihtolajittelu (2) Kaikki suoritusajat luokkaa Θ(n2) Yleensä keskitytään huonoimman tapauksen tarkasteluun Yläraja suoritusajalle Joskus myös keskimääräinen tapaus kiinnostava Esim. Quicksort, huonoin tapaus Θ(n2), keskimääräinen Θ(n∙lg(n)) Yleensä paras tapaus ei oleellinen Usein harvinainen erikoistapaus Ari Vesanen 811312A TRA, Algoritmien analyysi 30 II.2.3.6 Sisäkkäisten silmukoiden kompleksisuus Tutkitaan algoritmia ALGORITMI(n) 1. for i1 = 1 to n 2. for i2 = 1 to n k sisäkkäistä silmukkaa. ... k. for ik = 1 to n k+1. // Jokin vakioaikainen operaatio HUOM! Kaikki indeksit kulkevat 1..n eivätkä riipu toisistaan. Muuten seuraava tarkastelu ei välttämättä päde. Ari Vesanen 811312A TRA, Algoritmien analyysi 31 II.2.3.6 Sisäkkäisten silmukoiden kompleksisuus (2) Algoritmin suoritusaika muotoa a k n k a k -1 n k -1 a 1 n a 0 Miksi? Ainoastaan korkein termi vaikuttaa kompleksisuusluokkaan -> Algoritmi luokkaa Θ(nk) Jos algoritmin kompleksisuusluokka on O(nk) sitä sanotaan polynomiaikaiseksi Polynomiaikaisia algoritmeja pidetään laskennallisesti sovellettavina Ari Vesanen 811312A TRA, Algoritmien analyysi 32 II.2.4 Analyysi: Rekursiiviset algoritmit Rekursiivisille algoritmeille tarvitaan uusia menetelmiä: 1. Rekursiopuun avulla tarkastelu 2. Induktiivinen päättely 3. Rekursioyhtälön muodostaminen ja ”Master Theorem” Ari Vesanen 811312A TRA, Algoritmien analyysi 33 II.2.4.1 Esimerkki: Hanoin tornit Syöte: Luku N >= 1 ja paalujen numerot A, B ja C Tulostus: Siirtojärjestys N:lle kiekolle paalusta A paaluun B käyttämällä apuna paalua C SIIRRÄ(N,A,B,C) 1. if N==1 then 2. tulosta A -> B 3. else 4. SIIRRÄ(N-1,A,C,B) 5. tulosta A -> B 6. SIIRRÄ(N-1,C,B,A) 7. end if 8. return Ari Vesanen 811312A TRA, Algoritmien analyysi 34 II.2.4.1 Esimerkki: Hanoin tornit (2) Rekursiopuu: Kun N>1, haaraantuu kahteen osaan ja tekee yhden vakioaikaisen operaation (vertailu + tulostus) jne Tasolla N-1 loppuu, kukin haara tekee yhden vakioaikaisen operaation Koska jakaantuu kahtia, tasolla k tehdään 2k operaatiota -> Kaikkiaan 1+2+4+…+2N-1 = 2N-1 operaatiota Algoritmin kompleksisuusluokka on Θ(2N) Piirrä kuva! Ari Vesanen 811312A TRA, Algoritmien analyysi 35 II.2.4.1 Esimerkki: Hanoin tornit (3) Induktiivinen päättely: Merkitään algoritmin askelmäärä = T(N), kun kiekkoja N Selvästi T(1) = 1 Jos T(N-1) tunnetaan, T(N) = 1 + 2∙T(N-1) Ns. rekursioyhtälö Arvataan T(N) = 2N-1 ja todetaan induktiivisesti, että pitää paikkansa Ari Vesanen 811312A TRA, Algoritmien analyysi 36 II.2.4.2 Master Theorem Lause M .Olkoot a 1, b 1 kokonaislu kuvakioita ja f funktio. Rekursion T (n) a T ( n / b ) f (n) (tai T (n) a T ( n / b ) f (n) ) ratkaisulle pätee : 1) Jos f (n) O( n logb a ) jollakin v akiolla 0, niin T (n) ( n logb a ). 2) Jos f (n) ( n logb a ), niin T (n) ( n logb a lg n) 3) Jos f (n) ( n logb a ) jollakin v akiolla 0 ja jos a f (n / b) c f (n) jollakin v akiolla c 1 ja riittävän suurilla luvun n arvoilla, niin T (n) ( f (n)). Ari Vesanen 811312A TRA, Algoritmien analyysi 37 II.2.4.2 Master Theorem (2) Lausetta M voidaan soveltaa antamaan rekursiivisen algoritmin kompleksisuusluokka, kunhan rekursioyhtälö on muodostettu HUOM! Ei sovellu kaikkiin tapauksiin Esimerkiksi Hanoin tornien yhtälö ei ratkea lauseella M Ari Vesanen 811312A TRA, Algoritmien analyysi 38 II.2.4.2 Master Theorem (2) Ratkaise lauseen M avulla a) Rekursio T (n) 4 T (n / 2) n 2 Vastaus: T (n) ( n ) b) Rekursio T (n) 4 T (n / 2) n 2 2 Vastaus: T (n) ( n lg n) c) Rekursio T (n) 4 T (n / 2) n3 3 Vastaus: T (n) ( n ) d) Rekursio T (n) 2 T (n / 2) n lg n Vastaus: Lausetta ei voi soveltaa tähän tapaukseen Ari Vesanen 811312A TRA, Algoritmien analyysi 39 II.2.4.3 Esimerkki: Lomituslajittelu Syöte: Taulukko A[1,..,n], n >= 1, luvut 1 <= p <= q <= n Tulostus: Taulukon alkiot A[p..q] suuruusjärjestyksessä LOMITUSLAJITTELU(A,p,q) 1. if p < q 2. r = ( p q) / 2 3. 4. 5. 6. LOMITUSLAJITTELU(A,p,r) LOMITUSLAJITTELU(A,r+1,q) LOMITA(A,p,r,q) A[r] LOMITA: return A[p] 3 5 8 9 A[r+1] A[q] 2 6 7 8 2 3 5 6 7 8 8 9 Ari Vesanen 811312A TRA, Algoritmien analyysi 40 II.2.4.3 Esimerkki: Lomituslajittelu (2) Algoritmi rekursiivinen: aluksi lajitellaan listan alkiot A[p..r] ja A[r+1..q], sitten lomitetaan järjestyksessä olevat osalistat niin, että A[p..q] järjestyksessä Selvästi lomittaminen voidaan tehdä lineaarisessa ajassa Kumpikin osalista käydään kerran läpi Saadaan rekursio T (n) 2 T (n / 2) c n Lauseella M: T (n) ( n lg n) Ari Vesanen 811312A TRA, Algoritmien analyysi 41