Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia notaatioita: Ω eli iso-omega ja Θ eli theta Ω: asymptoottinen alaraja Θ: asymptoottinen yhtäsuuruus Tietorakenteet, syksy 2007 1 Terminologiasta: kasvunopeuden suuruusluokkaa nimitetään usein algoritmin (asymptoottiseksi) kompleksisuudeksi Määritelmä: on Ω(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 ainoa ero O:n määritelmään on suuremmuuden suunta = Ω(g(n)): kompleksisuus on vähintään g(n) Tietorakenteet, syksy 2007 2 algoritmin suoritusaika t = Ω(g(n)) jos ja vain jos g(n) = O() algoritmin suoritusaika t cg(n) g(n) 1 c cg(n) cg(n) n 0 Syötteen koko (parametri) n n 0 Syötteen koko (parametri) n Tietorakenteet, syksy 2007 3 Tietorakenteet, syksy 2007 4
Esimerkiksi = 2n 2 + 3n log(n) = Ω(n 2 ) 2n 2 + 3n log(n) n 2, kun n > n 0 = 1 Esimerkiksi = 1 100 n2 3n = Ω(n 2 ) 1 100 n2 = 1 200 n2 + 1 200 n2 1 200 n2 3n, kun n > n 0 = 600 = 1 100 n2 3n = 1 200 n2 + ( 1 200 n2 3n) 1 200 n2, kun n > n 0 = 600 Θ eli theta yhdistää O- ja Ω-merkinnät Määritelmä: on Θ(g(n)), jos on Ω(g(n)) ja on O(g(n)) on olemassa vakio n 0 > 0, c 1 > 0 ja c 2 > 0, joilla c 1 g(n) c 2 g(n) aina kun n > n 0 = Θ(g(n)): kompleksisuus on täsmälleen g(n) (vakiotekijän rajoissa) Tietorakenteet, syksy 2007 5 Tietorakenteet, syksy 2007 6 algoritmin suoritusaika t c 2 g(n) c 1 g(n) = Θ(g(n)) jos ja vain jos g(n) = Θ() c 1 g(n) c 2 g(n) 1 c 2 g(n) 1 c 1 algoritmin suoritusaika t c 2 g(n) c 1 g(n) n 0 Syötteen koko (parametri) n n 0 Syötteen koko (parametri) n Tietorakenteet, syksy 2007 7 Tietorakenteet, syksy 2007 8
Θ on asymptoottisesti yksikäsitteinen jos esim. = Θ(g 1 (n)) ja = Θ(g 2 (n)), niin g 1 (n) ja g 2 (n) omaavat keskenään saman kompleksisuuden Esim. O-raja voi olla asymptoottisesti epätarkka, mutta Θ-arvo ei 2n = O(n) (tarkka) ja toisaalta 2n = O(n 2 ) (epätarkka raja) Esimerkiksi = 1 100 n2 3n = Θ(n 2 ) aiemmin todettiin, että = Ω(n 2 ) tarvitsee näyttää, että = O(n 2 ) 1 100 n2 n 2 3n n 2 = 1 100 n2 3n 2n 2, kun n > n 0 = 0 1 100 n2 3n = Ω(n 2 ) ja 1 100 n2 3n = O(n 2 ), joten = 1 100 n2 3n = Θ(n 2 ) Tietorakenteet, syksy 2007 9 Tietorakenteet, syksy 2007 10 Asymptoottisen notaation käytöstä Huomioita O-notaation käytöstä merkintä = O(g(n)) ei oikeasti tarkoita yhtäsuuruutta, vaan että funktiolla on suuruusluokkaa g(n) oleva yläraja formaalisti O(g(n)) on funktioiden joukko sisältää kaikki funktiot, joiden kasvunopeus on korkeintaan samaa suuruusluokkaa kuin funktion g(n) voitaisiin siis (oikeammin) merkitä O(g(n)) Tietorakenteet, syksy 2007 11 Asymptoottisen notaation käytöstä Kuitenkin vallitseva tapa: = O(g(n)) Esimerkki: 2n 2 + 5n = 2n 2 + O(n) O(g(n)): jokin kasvunopeuden O(g(n)) omaava funktio O-arvot on yleensä tarkoituksenmukaista antaa mahdollisimman sievennetyssä muodossa Mukaanlukien vakiotermien poisto (esim. O(3n 2 ) sievennetään muotoon O(n 2 )) Vastaavat huomiot pätevät myös esim. Ω- ja Θ-notaatioille Tietorakenteet, syksy 2007 12
Asymptoottisen notaation käytöstä Asymptoottisen notaation päätarkoitus on auttaa algoritmien korkean tason analysoinnissa vakiokertoimien huomioimatta jättäminen voi olla käytännössä merkittävää esim. O(n log(n)) toisinaan käytännössä tehokkaampi kuin O(n) Usein O-notaatiota käytetään Θ-notaation roolissa Tyypillinen tulkinta: O() tarkoittaa (mahdollisimman) tiukkaa pahimman tapauksen kompleksisuutta Tietorakenteet, syksy 2007 13 Asymptoottisen notaation käytöstä Jos puhutaan yleisesti ottaen algoritmin kompleksisuudesta, niin O: algoritmin kompleksisuuden yläraja pahimman tapauksen analyysi Ω: algoritmin kompleksisuuden alaraja parhaan tapauksen analyysi Θ: algoritmin kompleksisuus vakiokertoimeen asti syötteestä riippumaton parhaalla ja pahimmalla tapauksella sama kompleksisuus Tietorakenteet, syksy 2007 14 Asymptoottisen notaation käytöstä Jos tarkastellaan nimenomaan parasta / keskimääräistä / pahinta tapausta: = Θ(g(n)): kompleksisuus on kyseisessä tapauksessa tarkalleen g(n) = O(g(n)): kompleksisuus on kyseisessä tapauksessa korkeintaan g(n) = Ω(g(n)): kompleksisuus on kyseisessä tapauksessa vähintään g(n) tällöin O ja ω mielekkäitä lähinnä jos tarkka Θ vaikea määrittää (tai se on vaikealukuinen) Tietorakenteet, syksy 2007 15 o ja ω O- ja Ω-merkintöjen aidot versiot: o ja ω Määritelmä: on o(g(n)), jos mille tahansa vakiolle c > 0 on olemassa vakioarvo n 0 siten, että < cg(n), kun n > n 0 on o(g(n)): g(n) 0, kun n tarkoittaa, että funktion kompleksisuus on aidosti pienempi kuin funktion g(n) vrt. = O(g(n)): kompleksisuus on pienempi tai yhtäsuuri kuin g(n) Esim. 2n + log(n) = 2n + o(n) Tietorakenteet, syksy 2007 16
o ja ω Määritelmä: on ω(g(n)), jos mille tahansa vakiolle c > 0 on olemassa vakioarvo n 0 siten, että > cg(n), kun n > n 0 funktion kompleksisuus on aidosti suurempi kuin funktion g(n) vrt. = Ω(g(n)): kompleksisuus on suurempi tai yhtäsuuri kuin g(n) Esim. 2n log(n) + 5n = ω(n) = ω(g(n)) g(n) = o() Muutama esimerkki Algorithm OddCount(A, n) odds 0 for i 0 to n 1 Do if A[i] on pariton then odds odds + 1 end if odds Asymptoottinen analyysi: riittää laskea alkeisoperaatioiden lukumäärän suuruusluokka o- ja ω-notaatioita käytetään melko harvoin Tietorakenteet, syksy 2007 17 Tietorakenteet, syksy 2007 18 Muutama esimerkki Algorithm OddCount(A, n) odds 0 for i 0 to n 1 do if A[i] on pariton then odds odds + 1 end if odds for-silmukan sisällä: O(1) silmukkaa suoritetaan O(n) kertaa kompleksisuus O(1) O(n) = O(1 n) = O(n) Tietorakenteet, syksy 2007 19 Algorithm FindFirstOdd(A, n) i 0 while i < n ja A[i] ei ole pariton do i i + 1 end while i Paras tapaus? A[0] on pariton parhaan tapauksen työmäärä Θ(1) Pahin tapaus? jokainen A[i] parillinen pahimman tapauksen työmäärä Θ(n) Ω(1) ja O(n), Θ ei yleisesti ottaen olemassa Tietorakenteet, syksy 2007 20
Algorithm FindFirstOdd(A, n) i 0 while i < n ja A[i] ei ole pariton do i i + 1 end while i Keskimääräinen tapaus? O(1) jos A sisältää satunnaislukuja todennäköisyys 1 2, että A[i] parillinen todennäköisyys edetä alkioon i: 1 2 i esim. i 4 n. 1 = 1 2 4 16-osalle syötteistä Tietorakenteet, syksy 2007 21 Algorithm FindFirstOdd(A, n) i 0 while i < n ja A[i] ei ole pariton do i i + 1 end while i Keskimääräinen tapaus jatkuu... olkoon q erilaisten kokoa n olevien syötteiden lukumäärä 1 2 i q syötettä, joilla tutkitaan alkio A[i] Tietorakenteet, syksy 2007 22 Algorithm FindFirstOdd(A, n) i 0 while i < n ja A[i] ei ole pariton do i i + 1 end while i Keskimääräinen tapaus jatkuu... kaikkien syötteiden käsittely: tutkitaan yhteensä Σ n 1 i=0 (q 1 ) alkiota 2 i keskiarvo: em. lukumäärä jaettuna arvolla q: Σi=0 n 1 ( 1 ) = 2 1 < 2 = O(1) 2 i 2 n 1 Tietorakenteet, syksy 2007 23 Hieman hankalampi tapaus: Voidaan soveltaa induktiota koodin yhteydessä ns. silmukkainvariantti Tutkitaan mitä tapahtuu algoritmin alkuvaiheessa (pienillä i:n arvoilla), ja yritetään edetä induktiivisesti arvosta i arvoon i + 1 Tietorakenteet, syksy 2007 24
Aluksi nyrkkisääntö: algoritmin kompleksisuuden määrää sen useimmin suoritetun operaation suorituskertojen lukumäärä, lkm max operaatioita vakio c operaatioiden kokonaislukumäärä korkeintaan c lkm max Tietorakenteet, syksy 2007 25 Tästä ensimmäinen huomio: algoritmin Mysteeri kompleksisuus verrannollinen sisäsilmukan suorituskertojen lukumäärään Jatkohuomio: kukin sisäsilmukan suoritus kasvattaa muuttujan c arvoa yhdellä kompleksisuus verrannollinen c:n lopulliseen arvoon Tietorakenteet, syksy 2007 26 Tutkitaan arvon c muutosta induktiivisesti i = 1: sisäsilmukka suoritetaan arvoille j = 2...n eli c kasvaa arvosta 1 arvoon n i = 2: sisäsilmukka suoritetaan arvoille j = n + 1...n 2 eli c kasvaa arvosta n arvoon n 2 Tietorakenteet, syksy 2007 27 i = 3: sisäsilmukka suoritetaan arvoille j = n 2 + 1...n 3 eli c kasvaa arvosta n 2 arvoon n 3 c:n arvot kun i = 1...3: n, n 2, n 3 c:n arvo näyttäisi noudattavan kaavaa n i Edetään induktioperiaatteen mukaisesti ja silmukkainvarianttia käyttäen Tietorakenteet, syksy 2007 28
Silmukkainvariantti: c:n arvo on n i kierroksen i jälkeen Induktio-oletus: sääntö päti kun i = 1...3. Oletetaan, että c:n arvo on n i aina kun i < i Induktioaskel: tutkitaan päteekö väite kierroksen i jälkeen Tietorakenteet, syksy 2007 29 Oletuksen nojalla c:n arvo kierroksen i 1 jälkeen on n i 1 kierroksen i alussa asetetaan eli k saa arvon nn i 1 = n i c:n arvo kasvaa arvolla k c, joten c:n uusi arvo on c + k c = k = n i Induktion nojalla väite pätee kaikilla i Tietorakenteet, syksy 2007 30 Kierroksen i = n jälkeen c = n i = n n Algoritmin Mysteeri kompleksisuus on näin ollen O(n n ) tarkkaan ottaen Θ(n n ), koska pahin ja paras tapaus identtisiä ja esitetyssä analyysissä ainoastaan vakiotekijän suuruinen epätarkkuus Tietorakenteet, syksy 2007 31