PM-03 p. 1/13 Programozási módszertan Függvények rekurzív megadása "Oszd meg és uralkodj" elv, helyettesítő módszer, rekurziós fa módszer, mester módszer Werner Ágnes Villamosmérnöki és Információs Rendszerek Tanszék e-mail: werner.agnes@virt.uni-pannon.hu
PM-03 p. 2/13 Bevezetés Algoritmusok futási idejének számítása gyakran vezet rekurzív egyenlethez, különösen akkor, ha az algoritmus rekurzív. Példa: összefésülő rendezés OSSZEFESULO-RENDEZES(A,bal,jobb); begin if bal<jobb then begin kozep:=(bal+jobb) div 2; OSSZEFESULO-RENDEZES(A,bal,kozep); OSSZEFESULO-RENDEZES(A,kozep,jobb); OSSZEFESUL(A,bal,kozep,jobb); end end;
PM-03 p. 3/13 Oszd meg és uralkodj elvű algoritmusok T(n) futási idő az n méretű bemenetre Tegyük fel, hogy az algoritmus a kimenetet közvetlenül kiszámítja, ha n < c valamilyen c konstansra A bemenetet a db részre osztja, amelyek mérete n b és ezeket a feladatokat rekurzívan oldja meg D(n) idő kell a részekre osztáshoz, C(n) idő a részproblémák megoldásaiból összerakni a kiindulási feladat megoldását futási idő: T(n) = { Θ(1), ha n c, at( n b ) + D(n) + C(n), egyébként
PM-03 p. 4/13 Összefésülő rendezés esetén a = 2 D(n) = Θ(1) az összefésülés elvégezhető lineáris időben: C(n) = Θ(n) futási idő: { Θ(1), ha n = 1, T(n) = 2T( n 2 ) + Θ(n), ha n > 1 Az egyenlet átírása után: T(n) = { c, ha n = 1, 2T( n 2 ) + c(n), ha n > 1 Felrajzolható a rekurziós fa T(n) = Θ(nlgn)
Rekurziós fa PM-03 p. 5/13
PM-03 p. 6/13 Rekurziós fa módszer 1 A rekurziós fa olyan fa, amelynek minden pontja egy eljáráshívást jelent adott aktuális paraméterekre, úgy, hogy a pont fiai megfelelnek azoknak az eljáráshívásoknak, amelyek végrehajtódnak az aktuális paraméterek esetén. Szintenként összegezzük a pontok költségét, majd a szinteket összeadva kapjuk a teljes költséget. Mivel a részproblémák mérete egyre csökken, ahogy egyre távolabb kerülünk a gyökértől, előbb-utóbb a részprobléma mérete olyan kicsi lesz, hogy rá nem a rekurziós képlet vonatkozik, hanem a kezdeti feltétel. Milyen messze leszünk ekkor a gyökértől?
PM-03 p. 7/13 Rekurziós fa módszer 2 Példa: Oldjuk meg a T(n) = 3T( n 4 )+Θ(n2 ) rekurzív egyenletet. az i-edik szinten lévő részprobléma mérete n/4 i a részprobléma mérete akkor lesz 1, ha n 4 i = 1 i = log 4 n a fának log 4 n + 1 szintje van (0,1,2,... log 4 n)
PM-03 p. 8/13 Rekurziós fa módszer 3 Ezután meghatározzuk a fa minden szintjének költségét. Minden szinten 3-szor annyi pont van, mint a felette lévő szinten az i-dik szinten 3 i pont van. A részproblémák mérete szintenként negyedére csökken, ezért minden szinten i = 0,1,2,...,log 4 n 1 -re a költség c( n 4 i ) 2 Ezeket összegezve az összes pontra azt kapjuk, hogy az i-edik szinten lévő pontok költsége i = 0,1,2,...,log 4 n 1 -re 3 i c( n 4 i ) 2 = ( 3 16 )i cn 2 Az utolsó log 4 n-edik szinten 3 log n 4 = n log 3 4 pont van, mindegyik T(1) költségű n log 3 4 T(1) az utolsó szint költsége, ami Θ(n log 3 4 )
PM-03 p. 9/13 Rekurziós fa módszer 4 A teljes fára összegezve: T(n) = cn 2 + 3 16 cn2 + ( 3 16 )2 cn 2 +... + ( 3 16 )log n 1 4 cn 2 + Θ(n log 3 4 ) = log 4 n 1 i=0 ( 3 16 )i cn 2 + Θ(n log 3 4 ) < i=0 ( 3 16 )i cn 2 + Θ(n log43 ) = 1 1 ( 3 )cn2 + Θ(n log43 ) 16 = O(n 2 )
PM-03 p. 10/13 Helyettesítő módszer Lépések: 1. Sejtsük meg a megoldást. 2. Teljes indukcióval határozzuk meg a konstansokat és igazoljuk a megoldás helyességét.
PM-03 p. 11/13 Helyettesítő módszer Példa: Határozzuk meg a T(n) = 2T( n 2 ) + n egyenlet egy felső korlátját! Sejtésünk az, hogy T(n) = O(nlg n). Megmutatjuk, hogy alkalmas c > 0 konstansra T(n) cnlg n. Tegyük fel, hogy n 2 -re teljesül a bizonyítandó, azaz T( n 2 ) c n 2 lg( n 2 ) Ezt behelyettesítve a rekurzív egyenletbe kapjuk, hogy T(n) 2(c n 2 lg( n 2 )) + n cnlg( n 2 ) + n = cnlg n cnlg 2 + n = cnlg n cn + n cnlg n, ha c 1
A mester módszer PM-03 p. 12/13
PM-03 p. 13/13 Mester tétel A T(n) = at( n b ) + f(n) típusú rekurzív egyenletek megoldására ad receptet, ahol a 1 és b > 1 konstansok, valamint f(n) aszimptotikusan pozitív függvény. Tétel: Legyenek a 1 és b > 1 konstansok, f(n) függvény, T(n) pedig a nemnegatív egészeken a T(n) = at( n b ) + f(n) rekurzív egyenlettel definiált függvény, ahol n b jelentheti akár az n b, akár az n b értéket. Ekkor T(n)-re a következő aszimptotikus korlátok adhatók. 1. Ha f(n) = O(n log b a ε ) valamely ε > 0 konstansra, akkor T(n) = Θ(n log b a ) 2. Ha f(n) = Θ(n log b a ), akkor T(n) = Θ(n log b a lg n) 3. Ha f(n) = Ω(n log a+ε b ) valamely ε > 0 konstansra, és ha af( n b ) cf(n) valamely c < 1 konstansra és eléggé nagy n-re, akkor T(n) = Θ(f(n))