2.2.1 Ratkaiseminen arvausta sovittamalla Esimerkki: lomitusjärjestäminen (edellä) Yleistys: Ratkaistava T (1) c T (n) g(t (1),..., T (n 1), n) missä g on n ensimmäisen parametrin suhteen kasvava. (Ratkaisu tässä tarkkuudella T (n) = O(...).) Menettely: 1. Arvataan ratkaisun muoto f, ts. oletetaan T (n) f(n, a 1,..., a k ) missä a = (a 1,..., a k ) myöhemmin määrättäviä parametreja (vrt. a ja b edellä) 2. Sovitetaan parametrien a 1,..., a k arvot niin, että voidaan todistaa c f(1, a) g(f(1, a),..., f(n 1, a), n) f(n, a) 3. Nyt T (n) f(n, a) seuraa induktiolla. 51
Huomattavaa: Hankalan yhtälön ratkaisuksi voi arvata samanmuotoisen siistimmän yhtälön ratkaisun. Esim. yhtälön T (n) = 2T (n/2 + 17) + 5n ratkaisu on sama Θ(n log n) kuin yhtälöllä T (n) = 2T (n/2) + n. Vaikka T (n) f(n) ei onnistu, voi silti olla T (n) = O(f(n)). Kokeile induktiohypoteesia T (n) f(n) + b missä b on uusi parametri. 52
2.2.2 Ratkaiseminen purkamalla Esimerkki: T (1) = 1 T (n) = 3T (n/4) + n kun n = 4 k > 1 Suoraan saadaan T (n) = 3T ( n 4 ) + n = 3(3T ( n 4 4 ) + n 4 ) + n = 3 2 T ( n 4 2) + 3 4 n + n = 3 2 (3T ( n 4 3) + n 4 2) + 3 4 n + n = 3 3 T ( n 4 3) + (3 4 )2 n + 3 4 n + n =... kun m k missä n = 4 k. = 3 m T ( n 4 m) + n m 1 ( 3 4 )i i=0 53
Erityisesti valisemalla m = k (jolloin 4 m = n) saadaan T (n) = 3 k T (1) + n ( 3 4 )i i=0 = 3 k + n (3/4)k 1 3/4 1 = 3 k (1 n (1/4)k 1/4 ) + n 1 1/4 = 3 log n 4 (1 4) + 4n (koska n = 4 k ) = 4n 3n log 4 3 (koska x log y = y log x ) = Θ(n) (koska log 4 3 < 1) 54
Yleisemmin: Olkoon T (1) = c 1 T (n) = at (n/b) + d(n) kun n = b k, k 1 missä a ja b ovat positiivisia kokonaislukuja ja d jokin funktio. Puretaan yhtälö, kun n = b k : 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 i T (b k i ) + =... i 1 a j d(b k j ) = a k T (1) }{{} + homogeeninen osa a j d(b k j ) }{{} epähomogeeninen osa 55
Homogeeninen osa on siis eli polynominen. a k c 1 = c 1 a log b n = c 1 n log b a Epähomogeeninen osa pitää tarkastella erikseen. Seuraavassa käsitellään tärkeä erikoistapaus d(n) = c 2 n α, α vakio. Lause ( Master Theorem ) Olkoot c 1, a, α > 0, c 2 0 ja b { 2, 3, 4,... } sekä T (1) = c 1 T (n) = at (n/b) + c 2 n α, n = b k > 1. Arvoilla n = b k, k = 0, 1, 2,..., pätee: 1. Jos a > b α tai c 2 = 0 niin 2. Jos a < b α ja c 2 0 niin 3. Jos a = b α ja c 2 0 niin T (n) = Θ(n log b a ). T (n) = Θ(n α ). T (n) = Θ(n α log n). Huom. a b α joss α log b a joss n α n log b a. 56
Todistus Edellä nähtiin, että T (n) = a k T (1) + = c 1 n log a b + c 2 a j c 2 (b k j ) α a j (b α ) k j. Tapaus c 2 = 0 on selvä. Jos a b α, saadaan a j (b α ) k j = b αk ( a b α)j = (b α ) k(a/bα ) k 1 a/b α 1 = ak (b α ) k a/b α 1 = ( a b α 1) 1 (n log b a n α ) sillä ja a k = a log b n = n log b a (b α ) k = (b k ) α = n α. 57
1. Jos a > b α, niin (a/b α 1) 1 > 0 ja n α < n log b a, joten epähomogeenisesta osasta tulee a j (b α ) k j = Θ(n log b a ) eli sama kuin homogeenisesta, joten myös koko ratkaisu on T (n) = Θ(n log b a ). 2. Jos a < b α, niin (a/b α 1) 1 < 0 ja n α > n log b a, joten epähomogeenisesta osasta tulee joten koko ratkaisu on a j (b α ) k j = Θ(n α ), T (n) = Θ(n log b a ) + Θ(n α ) = Θ(n α ). 58
3. Jos a = b α, epähomogeeniseksi osaksi saadaan a j (b α ) k j = ja koko ratkaisu on siis a k = ka k = (log b n)a log b n = (log b n)n log b a = Θ(n log b a log n) T (n) = Θ(n log b a ) + Θ(n log b a log n) = Θ(n log b a log n). 59
2.2.3 Muunnostekniikoita Esimerkki arvoalueen muunnos T (0) = 1 T (n) = 5T (n 1) 2, n 1 Merkitään U(n) = log T (n): Puretaan: U(0) = 0 U(n) = log(5t (n 1) 2 ) = 2 log T (n 1) + log 5 = 2U(n 1) + log 5, n 1. Siis U(n) = 2U(n 1) + log 5 = 2(2U(n 2) + log 5) + log 5 =... = 2 k U(n k) + =... = 2 n U(0) + log 5 = (2 n 1) log 5. n 1 2 j log 5 2 j T (n) = 2 U(n) = (2 log 5 ) 2n 1 = 5 2n 1. 60
Esimerkki muuttujanvaihto T (2) = 1 T (n) = 2T ( n) + (log n) 2 sopivilla n Merkitään U(k) = T (2 k ): U(1) = 1 U(k) = 2T (2 k/2 ) + (log 2 k ) 2 = 2U(k/2) + k 2 sopivilla k. Kuten aiemmin saadaan tästä eli U(2 i ) = 2 i + Siis kun n = 2 k saadaan i 1 i 1 = 2 i + 2 2i 2 j (2 i j ) 2 2 j = 2 i + 2 2i(1/2)i 1 1/2 1 = 2 i + 2 2i2 i 1 1/2 = 2 i + 2 2i+1 (1 2 i ) = 2 i + 2 2i+1 2 i+1 U(k) = k + 2k 2 2k = 2k 2 k. T (n) = U(log n) = 2(log n) 2 log n. 61
2.2.4 Generoivat funktiot Merkitään T (n) = t n. Jonon (t 0, t 1, t 2,...) generoiva funktio G saadaan kaavasta G(z) = t n z n (niillä z joilla tämä suppenee). Esimerkkejä 1. Jonon (1, 1, 1,...) generoiva funktio G saadaan geometrisesta sarjasta: G(z) = 1 z n = 1 1 z. 2. Jonon (1, 2, 4, 8,...) generoiva funktio on G missä G(z) = 2 n z n = (2z) n = 1 1 2z. 3. Jonon (0, 1, 2, 3, 4,...) generoiva funktio on G missä G(z) = nz n z = (1 z) 2. 62
Generoivien funktioiden käyttäminen rekursioyhtälöiden ratkaisemisessa perustuu siihen, että jos funktiolla on potenssisarjaesitys niin se on yksikäsitteinen: Lause Olkoon f funktio jolla on potenssisarjaesitykset f(z) = t n z n ja f(z) = s n z n jotka kumpikin suppenevat (ainakin) kun ε < z < ε jollain ε > 0. Tällöin t n = s n kaikilla n. Todistus Diff. int. I tms. Tästä saadaan seuraava resepti jonoa (t n ) koskevan rekursioyhtälön ratkaisemiseksi: 1. muodosta rekursioyhtälöstä yhtälö generoivalle funktiolle G 2. ratkaise G 3. kehitä saatu G potenssisarjaksi 4. luvut t n saadaan nyt suoraan potenssisarjan kertoimina Idea on, että rekursioyhtälö muuntuu generoivaa funktiota G koskevaksi algebralliseksi (tai differentiaali-) yhtälöksi, ja tällaisten ratkaiseminen tunnetaan melko hyvin. 63
Esimerkki Periaatteen selventämiseksi sovelletaan generoivia funktioita muutenkin helppoon yhtälöön t 0 = 1 t n+1 = 2t n 1. Sovelletaan yo. kaavaa G:n määritelmään: G(z) = t n z n = t 0 z 0 + = 1 + t n+1 z n+1 2t n z n+1 = 1 + 2z t n z n = 1 + 2zG(z). 2. Siis G(z) = 1 + 2zG(z), mistä ratkaistaan G(z) = 1 1 2z. 3. Geometrisen sarjan summakaavasta nähdään 2 n z n = (2z) n = 1 1 2z. 4. Siis t n = 2 n kaikilla n. 64
Sarjakehitelmän suppenemista ei yleensä kannata ruveta tarkastelemaan. Jos asiassa on jotain epäselvää, on yleensä järkevämpää tarkistaa tuloksen oikeellisuus suoraan sijoittamalla se alkuperäiseen yhtälöön: t 0 = 2 0 = 1 oikein! t n+1 = 2 n+1 = 2 2 n = 2t n oikein! Tarkistus on tietysti hyvä tehdä joka tapauksessa: lisävaiva on yleensä vähäinen ja laskuissa sattuu helposti virheitä. Toinen esimerkki Hieman mielenkiintoisempana esimerkkinä tarkastellaan Fibonaccin lukuja: f 0 = 0 f 1 = 1 f n = f n 1 + f n 2 kun n 2 65
Muodostetaan ensin yhtälö generoivalle funktiolle: G(z) = f n z n = 0 + z + = z + z = z + z( (f n 1 + f n 2 )z n n=2 f n 1 z n 1 + z 2 n=2 m=0 n=2 f m z m f 0 ) + z 2 ( = z + zg(z) + z 2 G(z). Ratkaisemalla G(z) saadaan G(z) = z 1 z z 2. f n 2 z n 2 m=0 f m z m ) 66
Funktion G potenssisarja saadaan kätevimmin osamurtokehitelmästä, joka on tuttu esim. rationaalifunktioiden integroinnista (Diff. int. I). Tiedetään, että muotoa R(z) = az + b (z r 1 )... (z r k ) r i r j kun i j oleva rationaalifunktio voidaan sopivasti valituilla kertoimilla A 1,..., A k esittää muodossa R(z) = A 1 z r 1 +... + A k z r k. Tunnetusti 1 z z 2 = (z r 1 )(z r 2 ) missä r 1 ja r 2 ovat yhtälön 1 z z 2 = 0 juuret r 1 = 1 2 (1 + 5) r 1 = 1 2 (1 5) Voidaan siis kirjoittaa G(z) = z 1 z z = z 2 (z r 1 )(z r 2 ) = A 1 + A 2 z r 1 z r 2 missä r 1 ja r 2 on annettu yllä ja vakiot A 1 ja A 2 pitää vielä määrätä. 67
Ratkaistaan vakiot A 1 ja A 2 joilla pätee z (z r 1 )(z r 2 ) = A 1 z r 1 + A 2 z r 2 eli kun z r 1 ja z r 1 z = A 1 (z r 2 ) + A 2 (z r 1 ). Erityisesti tämän pitää päteä rajalla z r 2 : eli r 2 = A 2 (r 2 r 1 ) A 2 = r 2 r 1 r 2. Vastaavasti rajalla z r 1 saadaan eli r 1 = A 1 (r 1 r 2 ) A 1 = r 1 r 2 r 1. Siis näillä arvoilla r 1, r 2, A 1 ja A 2 pätee G(z) = A 1 z r 1 + A 2 z r 2. 68
Siis kun sijoitetaan vakioiden A 1 ja A 2 arvot saadaan G(z) = A 1 z r 1 + A 2 = A 1 r 1 = 1 r 1 r 2 z r 2 1 A 2 1 z/r 1 r 2 1 1 z/r 2 1 + 1 1 z/r 1 r 2 r 1 1 1 z/r 2. Sovelletaan geometrisen sarjan summaa: 1 G(z) = ( z ) n + 1 ( z ) n r 1 r 2 r 1 r 2 r 1 r 2 ) 1 = (( 1r1 ) n ( 1r2 ) n z n. r 1 r 2 Tästä nähdään f n = 1 r 1 r 2 (( 1r1 ) n ( 1r2 ) n ) eli, kun sijoitetaan arvot r 1 ja r 2 ja sievennetään, ( (1 f n = 1 ) n ( ) n ) + 5 1 5. 5 2 2 Huom. (1 + 5)/2 1, 618 ja (1 5)/2 0, 618, joten f n = O(1, 62 n ). 69