NodeCount(v /* lskee solmun v lipuun solmujen lukumäärän */ if solmu v on null return 0 else return + NodeCount(v.left + NodeCount(v.right Rekursio: lgoritmi kutsuu itseään Usein hjot j hllitse -perite: j lkuperäinen koon n omv syöte osiin prosessoi ost rekursiivisesti muodost lopullinen tulos plojen ostuloksist MergeSort(A, lef t, right if left < right middle (left + right/ MergeSort(A, lef t, middle MergeSort(A, middle +, right Merge(A, lef t, middle, right Rekursiivisen lgoritmin ikvtivuus? hnklhko määrittää suorn pseudokoodist Merkintä: T(n = rekursiivisen lgoritmin ikvtivuus (kokonistyö koon n omvn syötteelle Tietorkenteet, syksy 007 MergeSort(A, lef t, right työ: T(n, missä n = right-lef t+ if left < right ehto tosi, kun n middle (lef t + right/ työ: O( MergeSort(A,left, middle työ: T(n, j n = middle-left+ MergeSort(A,middle +,right työ: T(n, n = right-middle Merge(A, lef t, middle, right työ: O(n Arvo T(n määritetään rekursiivisesti, ns. rekursioyhtälön pohjlt esim. yllä{ sdn rekursioyhtälö O(, kun n < T(n = T(n + T(n + cn, kun n lrivi muoto T( n +cn, kosk n n n Tietorkenteet, syksy 007 3 Tietorkenteet, syksy 007 Rekursioyhtälön rtkisutp #: itertiivinen korvus kirjoitetn rekursioyhtälöä uki muutmn ensimmäisen rekursiokutsun oslt pyritään hvitsemn rvolle T(n rekursion syvyydestä riippuv säännönmukisuus Esim. rekursioyhtälö T(n = T( n + cn: rekursion syvyys : T(n = ( T( n 4 + cn + cn= 4 T( n 4 + cn + cn = 4 T(n 4 + cn Tietorkenteet, syksy 007 4
Edellä stiin T(n = T( n +cn = 4 T(n 4 +cn rekursion syvyys 3: T(n = 4 T( n 4 + cn = 4( T(n 8 + cn 4 + cn = 8 T( n 8 + cn + cn = 8 T(n 8 + 3cn Huomtn yleinen sääntö rekursion syvyydelle i: T(n = i T( n i + icn Arvon i mksimi? n i kun i log (n Lopullinen rvo: tehdään sijoitus i = log (n T(n = log (n T( n log (n + log (ncn = n T( + log (ncn = O(n log(n Tietorkenteet, syksy 007 5 T(n = T( n +cn, rvus: T(n n = O(n T(n = T( n + cn n + cn = n + cn cn > 0, joten n + cn > n induktio epäonnistui j rvus epätosi Uusi rvus: T(n n log(n T(n = T( n + cn n log(n + cn = n log( n + cn vlitn esim. = c, jolloin n log( n + cn = n(log( n + n log(n, kun n suuri induktio onnistui j siis T(n = O(n log(n Tietorkenteet, syksy 007 7 Rekursioyhtälön rtkisutp #: rv-j-test rvtn (päätellään hyvältä tuntuv rtkisu yritetään todist rtkisu todeksi induktioll toistetn kunnes löytyy hyvä rtkisu Esim. iempi rekursioyhtälö T(n = T( n +cn: Voidn ensin rvt optimistisesti T(n = O(n eli että T(n n, jollin vkioll Yritetään edetä induktiivisesti (rekursio-skel: sijoitetn rvus rekursioyhtälön oikelle puolelle, j tutkitn päteekö rvus koko yhtälölle Tietorkenteet, syksy 007 6 Rekursioyhtälön rtkisutp #3: rekursiopuu työ: cn/ työ: cn työ: cn/ cn/4 cn/4 cn/4 cn/4 c c c c c c c c c c tson 0 työt: cn tson työt: cn tson työt: cn tson log n työt: cn esitetään rekursiokutsujen hierrki puun solmun työ = sitä vstvn rekursiokutsun työ ei lsket mukn likutsujen työtä! kokonistyö: solmujen yhteenlskettu työ esim. yllä: tson i solmut yhteensä i cn = cn j log(n tso, siis kikki solmut = cnlog(n i Tietorkenteet, syksy 007 8
Alg(n Alg(n T( n T(n T( n T( n T( n T( n T( n T( n T( n Yleinen tsjkoinen rekursiopuu tyypillinen hjot j hllitse -menetelmälle koon n kutsu tekee in kpplett koon n/ omv rekursiivist likutsu Tietorkenteet, syksy 007 9 c f( n f(n f( n f( n f( n f( n f( n f( n c c c c c c c c f( n c c c c c c c c c Yleinen tsjkoinen rekursiopuu... rekursioyhtälö { muoto: T(n = T( n + f(n, kun n d Tietorkenteet, syksy 007 Θ( Θ( Θ( Θ( Θ( Yleinen tsjkoinen rekursiopuu... rekursioyhtälö { muoto: T(n = T( n + f(n, kun n d Tietorkenteet, syksy 007 0 Yleinen tsjkoinen { rekursioyhtälö..: T(n = T( n + f(n, kun n d f(n = kyseisen kutsun itse tekemä työ (ei lske mukn rekursiivisi likutsuj T(n vst kyseisen kutsun rekursiolipuun kikkien solmujen työtä, f(n inostn solmun om työtä d vkiorj, jot pienemmät syötteet vtivt korkeintn vkion c verrn työtä Tietorkenteet, syksy 007
Alg(n Alg(n Yleisen tsjkoisen rekursiopuun koko? korkeus: h = log (n lehtien lukumäärä: h = log (n = n log ( merkitään = x,n = y, nyt log (n = xlog ( y = xy log ( = y log ( x = n log ( Tietorkenteet, syksy 007 3 Sääntö : Jos f(n = Θ(n log( log(n k, missä k ei-negtiivinen vkio, niin T(n = Θ(n log( log(n k+ eli log(n Θ(n log( log(n k (solmutsojen työt sm suuruusluokk Sääntö 3: Jos f(n = Ω(n log ( n ε = Ω(n log (+ε, missä ε positiivinen vkio, j lisäksi f(n/ cf(n jollin vkioll c < in kun n suuri, niin T(n = Θ(f(n sisäsolmujen kokonistyö dominoi, j puun tsojen työmäärien summ muoto cf(n Tietorkenteet, syksy 007 5 Tsjkoisen rekursioyhtälön rtkisutp: ns. hllintmenetelmä (mster method pohjutuu sisäsolmutsojen j lehtisolmutson työmäärien vertiluun lehtitson työ: c n log ( = O(n log ( Sääntö : Jos f(n = O( nlog ( n ε = O(n log ( ε, missä ε positiivinen vkio, niin T(n = Θ(n log ( tulkint: f(n yksittäisen sisäsolmutson työ eli sisäsolmujen kokonistyö log(nf(n lehtitson työmäärä dominoi sisäsolmutsot (log(nf(n pienempi kuin lehtien työ Tietorkenteet, syksy 007 4 Esimerkki : T(n = T( n + cn =, =, f(n = cn log ( = log ( = f(n = n = Θ(n = Θ(n log ( log(n 0 sääntö : T(n = Θ(n log ( log(n 0+ = Θ(n log(n = Θ(n log(n Tietorkenteet, syksy 007 6
Esimerkki : T(n = 6T( n + n = 6, =, f(n = n log ( = log (6 = 4 f(n = n = O(n 4 = O(n log ( sääntö : T(n = Θ(n log ( = Θ(n 4 Tietorkenteet, syksy 007 7 Esimerkki 3: T(n = T( n + n =, =, f(n = n log ( = log ( = f(n = n = O(n + = O(n log (+ sopii sääntöön 3...:...mutt vielä pitää trkist, päteekö f(n/ cf(n, missä c < selvästi in f(n/ = n = n n sääntö 3 ok, joten T(n = Θ(f(n = Θ(n Tietorkenteet, syksy 007 8