19. Függvéyek rekurzív megdás, mester módszer Algoritmusok futási idejéek számítás gykr vezet rekurzív egyelethez, külööse kkor, h z lgoritmus rekurzív. Tekitsük például h z összefésülő redezés lábbi lgoritmusát. OSSZEFESULO-RENDEZES(A, bl, jobb); Begi If bl < jobb The Begi kozep:=(bl+jobb) div 2; OSSZEFESULO-RENDEZES(A, bl, kozep); OSSZEFESULO-RENDEZES(A, kozep, jobb); OSSZEFESUL(A, bl,kozep, jobb); Ed Ed;{Osszefesulo-redezes} 19.1. Oszd-meg-és-urlkodj elvű lgoritmusok elemzése Jelölje T () z -méretű bemeetre futási időt. Tegyük fel, hogy egy oszd-meg-és-urlkodj elvű lgoritmus kimeetet közvetleül kiszámítj, h < c v.m. c kostsr, egyébkét bemeetet drb részre osztj, melyek midegyikéek mérete /b és ezeket részfeldtokt rekurzív oldj meg. H D() idő kell részekre osztáshoz, és egy (-méretű) bemeetre z részproblémák megoldásiból C() időbe tudj összerki kiidulási feldt megoldását, kkor futási időre z lábbi rekurzív egyelőséget kpjuk. { Θ(1) h c, T () = T (/b) + D() +C() egyébkét. Az összefésülő redezés eseté = 2 és D() = Θ(1), továbbá z összefésülés elvégezhető lieáris időbe, így C() = Θ() tehát { Θ(1) h = 1, T () = (1) 2T (/2) + Θ() h > 1. Írjuk át z (1) egyeletet következő lkr. { c h = 1, T () = 2T (/2) + c h > 1. (2) A következő ábrá láthtó rekurziós f lpjá zt kpjuk, hogy T () = Θ(lg) 19.2. Helyettesítő módszer Rekurzív egyelet megoldásák helyettesítő módszere két lépésből áll: 1. Sejtsük meg megoldást. 2. Teljes idukcióvl htározzuk meg kostsokt és igzoljuk megoldás helyességét. Példkét htározzuk meg T () = 2T ( /2 ) + (3) egyelet egy felső korlátját. Sejtésük z, hogy T () = O( lg ). Megmuttjuk, hogy lklms c > 0 kostsr T () c lg. Tegyük fel, hogy /2 -re teljesül bizoyítdó, vgyis T ( /2 ) c /2 lg( /2 ). Ezt behelyettesítve rekurzív egyeletbe kpjuk, hogy hol z utolsó lépés kkor igz, h c 1. T () 2(c /2 lg( /2 )) + clg(/2) + = clg clg2 + = clg c + clg, 1
T() c c T(/2) T(/2) c/2 c/2 T(/) T(/) T(/) T(/) () (b) (c) c c c/2 c/2 c lg c/ c/ c/ c/ c c c c c c c c c (d) Totl: c lg + c 1. ábr. Az összefésülő redezés rekurziós fáj. 2
19.3. A rekurziós f módszer A rekurziós f oly f, melyek mide potj egy eljáráshívást jelet dott ktuális prméterekre, úgy, hogy pot fii megfelelek zokk z eljáráshívásokk, melyek végrehjtódk z ktuális prméterek eseté. Szitekét összegezzük potok költségét, mjd sziteket összedv kpjuk teljes költséget. Példkét rekurziós f lklmzásávl oldjuk meg T () = 3T ( / ) + Θ( 2 ) rekurziós egyeletet. Mivel részproblémák T() c 2 c 2 2 2 2 () (b) (c) c 2 c 2 2 2 2 3 c2 log 2 c ( ) c ( 2 ) 2 2 c ( ) c ( 2 ) 2 2 c ( ) c ( 2 ) 2 ( 3 ) 2 c 2 T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) Θ( log 3 ) log 3 (d) O( 2 ) 2. ábr. Rekurziós f mérete egyre csökke, hogy egyre távolbb kerülük gyökértől, előbb-utóbb részproblém mérete oly kicsi lesz, hogy rá em rekurziós képlet votkozik, hem kezdeti feltétel. Milye messze leszük ekkor gyökértől? Az i-edik szite lévő részproblém mérete / i, így részproblém mérete kkor lesz 1, h / i = 1, zz h i = log. Tehát fák log + 1 szitje v, (0,1,2,...,log ). Ezutá meghtározzuk f mide szitjéek költségét. Mide szite háromszor yi pot v, mit felette lévő szite, ezért z i-edik szite 3 i pot v. A részproblémák mérete szitekét egyedére csökke, ezért mide szite i = 0,1,2,...,log 1-re költség c(/ i ) 2. Ezeket összegezve z összes potr zt kpjuk, hogy z i-edik szite lévő potok költsége i = 0,1,2,...,log 1-re 3 i c(/ i ) 2 = (3/) i c 2. Az utolsó log -edik szite 3 log = log 3 pot v, midegyik 3
T (1) költségű, tehát z utolsó szit költsége log 3 T (1), mi Θ( log 3 ). A teljes fár összegezve: T () = c 2 + 3 ( 3 c2 + = log 1( 3 i=0 ) 2 ( ) 3 log 1 c 2 + + c 2 + Θ( log 3 ) ) i c 2 + Θ( log 3 ) = (3/)log 1 c 2 + Θ( log 3 ). (3/) 1 T () = < = log 1 i=0 i=0 ( 3 ( ) 3 i c 2 + Θ( log 3 ) ) i c 2 + Θ( log 3 ) 1 1 (3/) c2 + Θ( log 3 ) = 13 c2 + Θ( log 3 ) = O( 2 ). Tehát T () = O( 2 ) sejtést kptuk T () = 3T ( / ) + Θ( 2 ) rekurzív egyeletre. H O( 2 ) felső korlát, kkor erős felső korlát is egybe, mert z első rekurzív hívás költsége rögtö Θ( 2 ), így T () = Θ( 2 ). A T () = O( 2 ) sejtés helyességéek igzolás helyettesítő módszerrel. Meg kell mutti, hogy T () d 2 vlmely d > 0 kostsr. Az utolsó egyelőtleség d (/13)c eseté teljesül. T () 3T ( / ) + c 2 3d / 2 + c 2 3d(/) 2 + c 2 = 3 d2 + c 2 d 2 19.. A mester módszer A mester módszer T () = T (/b) + f () () típusú rekurzív egyeletek megoldásár d receptet, hol 1 és b > 1 kostsok, továbbá f () szimptotikus pozitív függvéy. A () képlet oly rekurzív lgoritmus futási idejét dj meg, mely méretű feldtot drb részproblémár bot, midegyik mérete /b, vlmely d b pozitív kostsokr és z drb részproblémát rekurzív oldj meg, midegyiket T (/b) időbe. A részproblémákr botás és részproblémák megoldásiból kiidulási problém megoldásák összerkásák idejét f () függvéy dj meg. (Tehát korábbi f () = D() +C().) például, OSSZEFESULO-RENDEZES lgoritmus eseté = 2, b = 2, és f () = Θ(). A mester tétel 19.1. tétel. (mester tétel.) Legyeek 1 és b > 1 kostsok, f () függvéy, T () pedig emegtív egészeke T () = T (/b) + f () rekurzív egyelettel defiiált függvéy, hol /b jeletheti kár z /b, kár /b értéket. Ekkor T ()-re következő szimptotikus korlátok dhtók.
1. H f () = O( log b ε ) vlmely ε > 0 kostsr, kkor T () = Θ( log b ). 2. H f () = Θ( log b ), kkor T () = Θ( log b lg). 3. H f () = Ω( log b +ε ) vlmely ε > 0 kostsr, és h f (/b) c f () vlmely c < 1 kostsr és eléggé gy -re, kkor T () = Θ( f ()). Példák mester módszer hszáltár. Első példkét tekitsük T () = 9T (/3) + rekurzív egyeletet. Ebbe z esetbe = 9, b = 3, f () =, tehát log b = log 3 9 = Θ( 2 ). Mivel f () = O( log 3 9 ε ), hol ε = 1, ezért mester tétel 1. esetét lklmzhtjuk, és kpjuk T () = Θ( 2 ) megoldást. Másik példkét tekitsük T () = T (2/3) + 1 egyeletet, hol = 1, b = 3/2, f () = 1. log b = log 3/2 1 = 0 = 1. A 2. esetet lklmzhtjuk, mivel f () = Θ( log b ) = Θ(1), tehát megoldás T () = Θ(lg). Hrmdik példák T () = 3T (/) + lg rekurzív egyelet, hol = 3, b =, f () = lg, és log b = log 3 = O( 0.793 ). Mivel f () = Ω( log 3+ε ), hol ε 0.2, 3. esetet lklmzhtjuk, feltéve, hogy f ()-re teljesül, hogy szimptotikus pozitív. Eléggé gy -re f (/b) = 3(/) lg(/) (3/)lg = c f () hol c = 3/, tehát T () = Θ(lg). A mester tétel bizoyítás. 19.5. A mester tétel bizoyítás egész kitevős htváyokr 19.2. lemm. Legyeek 1 és b > 1 kostsok, f () pedig legye b egész kitevős htváyi értelmezett emegtív függvéy. A T () függvéyt defiiáljuk b egész kitevős htváyi következő rekurzív egyelettel. { Θ(1) h = 1, T () = T (/b) + f () h = b i, hol i pozitív egész. Ekkor log b 1 T () = Θ( log b ) + j f (/b j ). (5) Bizoyítás. A következő ábrá láthtó rekurziós fát hszáljuk bizoyítás sorá. A f gyökeréek költsége f () és fi v, egyekét f (/b) költséggel. Mide fiúk v fi, egyekét f (/b 2 ) költséggel, tehát potos 2 pot v gyökértől 2 távolságr. Áltláos, potos j pot v gyökértől j távolságr, midegyik költsége f (/b j ). A levelek költsége egyekét T (1) = Θ(1) és midegyik levél log b szite v, mivel /b log b = 1. A fák összese log b = log b levele v. H összegezzük szitek költségét, kkor z (5) egyelethez jutuk. A j-edik szite lévő potok költsége j f (/b j ), így belső potok összköltsége log b 1 j f (/b j ) A levelek összköltsége pedig Θ( log b ) gyságredű, mert eyi drb részproblém v. 19.3. lemm. Legyeek 1 és b > 1 kostsok, f () pedig b egész kitevős htváyi értelmezett emegtív függvéy. A g() függvéyt defiiáljuk b egész kitevős htváyir következő rekurzív képlettel: log b 1 g() = Erre függvéyre b egész kitevői eseté következő szimptotikus korlátok érvéyesek. 1. H f () = O( log b ε ) vlmely ε > 0 kostsr, kkor g() = O( log b ). j f (/b j ) (6) 5
f() f() f(/b) f(/b) f(/b) f(/b) log b f(/b 2 ) f(/b 2 ) f(/b 2 ) f(/b 2 ) f(/b 2 ) f(/b 2 ) f(/b 2 ) f(/b 2 ) f(/b 2 ) 2 f(/b 2 ) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ( log b ) log b log b 1 Θ( log b )+ j f(/b j ) 3. ábr. Rekurziós f mester tétel bizoyításához. 6
2. H f () = Θ( log b ), kkor g() = Θ( log b lg). 3. H f (/b) c f () vlmely c < 1 kostsr és mide b eseté, kkor g() = Θ( f ()). Bizoyítás. Az 1. esetbe f () = O( log b ε ). Ebből következik, hogy f (/b j ) = O((/b j ) log b ε ). Ezt (6) egyelőségbe helyettesítve zt kpjuk, hogy ( logb 1 g() = O ( ) j ) logb ε b j. (7) Az O jelölése belüli összegre úgy duk korlátot, hogy bizoyos tgokt kiemelük, illetve egyszerűsítük, így végül egy övekvő mérti sorozthoz jutuk. log b 1 ( j ) logb ε b j log b 1( ) = log b b ε ε j b log b log b 1 = log b ε (b ε ) j ( = log b b ε εlog b ) 1 b ε 1 ( = log b ε ε ) 1 b ε. 1 Mivel b és ε álldók, ezért z utóbbi kifejezés egyszerűsíthető úgy, hogy log b ε O( ε ) = O( log b ). Ezt (7) összefüggésbe helyettesítve kpjuk, hogy g() = O( log b ), és ezzel z 1. esetet bebizoyítottuk. A 2. esetbe f () = Θ( log b ) feltétel mellett zt kpjuk, hogy f (/b j ) = Θ((/b j ) log b ). A (6) egyelőségbe helyettesítve rr jutuk, hogy ( logb 1 g() = Θ ( ) j ) logb b j. (8) A Θ- belüli összegekre z 1. esethez hsoló duk korlátot, de ekkor em kpuk mérti sort. Vegyük zob észre, hogy mide tg ugyz. log b 1 ( j ) logb b j log b 1( = log b ) j b log b log b 1 = log b 1 = log b log b. Ezt helyettesítve (8)-b kpjuk, hogy g() = Θ( log b log b ) = Θ( log b lg), és ezzel 2. esetet is bebizoyítottuk. A 3. esetet is hsoló bizoyítjuk. Mivel f () előfordul g() defiíciójáb és g() mide tgj emegtív, rr jutuk, hogy g() = Ω( f ()) b mide egész kitevős htváyár. Feltételezésük szerit f (/b) c f () v.m. c < 1-re mide b eseté, tehát f (/b) (c/) f (). j-szer ismételve kpjuk, hogy f (/b j ) (c/) j f (), vgy mi ezzel ekvivles, j f (/b j ) 7
c j f (). Ezt behelyettesítve és egyszerűsítve most egy csökkeő mérti sort kpuk, mivel c kosts. g() = log b 1 j f (/b j ) log b 1 c j f () f () = f () c j = O( f ()) ( 1 1 c Tehát g() = Θ( f ()) b mide egész kitevős htváyir. Ezzel 3. esetet is beláttuk. Most már bebizoyíthtjuk mester tételt rr z esetre, mikor egész kitevős htváy b-ek. 19.. lemm. Legyeek 1 és b > 1 kostsok, f () pedig legye b egész kitevős htváyi értelmezett emegtív függvéy. A T () függvéyt defiiáljuk b egész kitevős htváyir következő rekurzív képlettel: { Θ(1) h = 1, T () = T (/b) + f () h = b i, hol i pozitív egész. Ekkor T ()-re b egész kitevői eseté következő szimptotikus korlátok dhtók. 1. H f () = O( log b ε ) vlmely ε > 0 kostsr, kkor T () = Θ( log b ). 2. H f () = Θ( log b ), kkor T () = Θ( log b lg). 3. H f () = Ω( log b +ε ) vlmely ε > 0 kostsr és f (/b) c f () vlmely c < 1 kostsr és elég gy -re, kkor T () = Θ( f ()). Bizoyítás. A bizoyításhoz (18.3) lemm korlátit hszáljuk. Az 1. esetbe 2. esetbe és 3. esetbe ) T () = Θ( log b ) + O( log b ) = Θ( log b ), T () = Θ( log b ) + Θ( log b lg) = Θ( log b lg), T () = Θ( log b ) + Θ( f ()) = Θ( f ()), mivel f () = Ω( log b +ε ). 19.6. Alsó és felső egész részek A mester tétel bizoyításák teljessé tételéhez elemzésüket ki kell terjesztei zokr z esetekre is, mikor mester egyeletbe lsó és felső egész részek is szerepelek, zért, hogy rekurzív egyeletet mide egész számr defiiáljuk, e csk b egész kitevőire. Egyszerűe dhtuk lsó korlát T () = T ( /b ) + f () (9) egyeletre, és felső korlátot T () = T ( /b ) + f () (10) 8
egyeletre, mivel z 1. esetbe /b /b egyelőtleséget, 2. esetbe pedig /b /b egyelőtleséget hszálhtjuk ki. A két eset hsoló bizoyíthtó, ezért csk z utóbbit fogjuk megmutti. Módosítsuk korábbi rekurziós fát úgy, hogy z rgumetumok felső egész részei szerepeljeek bee. Ahogy lefelé hlduk rekurziós fáb, következő sorozt szeriti rgumetumokr törtéik hívás., /b, /b /b, /b /b /b,. 9
f() f() f( 1 ) f( 1 ) f( 1 ) f( 1 ) log b f( 2 ) f( 2 ) f( 2 ) f( 2 ) f( 2 ) f( 2 ) f( 2 ) f( 2 ) f( 2 ) 2 f( 2 ) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ( log b ) Θ( log b ) log b 1 Θ( log b )+ j f( j ). ábr. Módosított rekurziós f mester tétel bizoyításához. 10
Jelölje j sorozt j-edik elemét, hol { h j = 0, j = j 1 /b h j > 0. (11) Először htározzuk meg zt k mélységet, melyre már k kosts. A x x + 1 egyelőtleséget felhszálv zt kpjuk, hogy 0, 1 b + 1, 2 b 2 + 1 b + 1, 3 b 3 + 1 b 2 + 1 b + 1,. és így j = log b eseté j j 1 b j + 1 i=0 b i < b j + 1 i=0 b i = b j + b. logb < tehát log b mélységbe részproblémák mérete kosts. Az ábr lpjá zt kpjuk, hogy = b log b + b b log b 1 + b /b + = b + b = O(1), b log b 1 T () = Θ( log b ) + j f ( j ), (12) mi gyo hsoló mester egyelethez, kivéve, hogy tetszőleges egész és em csk b egész kitevős htváy. Most már kiszámíthtjuk z összeget, mi log b 1 g() = j f ( j ) (13) A 3. esettel kezdve, legye f ( /b ) c f () h > b + b/(), hol c < 1 kosts, tehát j f ( j ) c j f (). Így (13) egyeletbe lévő összeg ugyúgy számíthtó ki, mit 18.3. lemmáb. A 2. esetbe f () = Θ( log b ) teljesül. H meg tudjuk mutti, hogy f ( j ) = O( log b / j ) = O((/b j ) log b ), kkor 18.3 lemm 2. esetre votkozó bizoyítás lklmzhtó. Vegyük észre, hogy j log b mitt b j / 1. Az f () = O( log b ) korlát mg utá voj oly c > 0 kosts létezését, hogy elég 11
gy j -re ( f ( j ) c b j + b ( = c (1 b j + b j ( log b = c j ( log b c j ) logb )( 1 + ( ) log b = O, j b ( b j )( 1 + b )) logb b ) logb )) logb mivel c(1 + b/()) log b kosts. Ezzel 2. esetet bebizoyítottuk. Az 1. eset bizoyítás ezzel szite zoos. A bizoyítás kulcs z, hogy egy boyolultbb számítást igéylő, de 2. eset megfelelő bizoyításához hsoló módo igzoljuk f ( j ) = O( log b ε ) korlátot. Ezzel mester tételbe szereplő felső korlátokt mide egész -re igzoltuk. Az lsó korlátok hsoló bizoyíthtók. 12