w03 - równania rekurencyjne

27
Podstawy analizy algorytmów Równania rekurencyjne niejednorodne, to takie, w których n-ty wyraz nie zależy wylącznie od wyrazów poprzednich, ale i od pewnej funkcji zmiennej n. Równania takie są naturalnym sposobem opisywania zlożoności obliczeniowej algorytmów rekurencyjnych, tzn. takich, które wywolują same siebie.

Upload: vkajnskvja

Post on 21-Oct-2015

169 views

Category:

Documents


0 download

TRANSCRIPT

Podstawy analizy algorytmów

Równania rekurencyjne niejednorodne, to takie, w którychn-tywyraz nie zależy wyłącznie od wyrazówpoprzednich, ale i odpewnej funkcji zmiennej n. Równania takie są naturalnymsposobem opisywania złożoności obliczeniowej algorytmówrekurencyjnych, tzn. takich, które wywołują same siebie.

Rozważmy następujący algorytm rekurencyjny sortujący listę liczb.

Podstawy analizy algorytmów

function mergesort(L: LIST; n: int): LIST;var L1, L2: LIST;begin

if n = 1 then return (L)if n = 1 then return (L)else begin

podzielL na dwie części L1 i L2 o długości n/2;return (merge(mergesort(L1, n/2), mergesort(L2, n/2)))

endend;

Ideą działania powyższego algorytmu jest podzieleniezbioru danychL na mniejsze zbiory (L1 i L2), aż do uzyskanianzbiorów jednoelementowych, które same z siebie są

posortowane,następnie zbiory te są łączonew corazwiększe

Podstawy analizy algorytmów

posortowane,następnie zbiory te są łączonew corazwiększezbiory posortowane, aż do uzyskania jednego, posortowanegozbioru n-elementowego. Etap dzielenia nie jest skompliko-wany, dzielenie następuje bez sprawdzania jakichkolwiekwarunków.

Równania typu „dziel i rządź”Równania typu „dziel i rządź”

Rozważania nasze rozpoczynamy od równania (3.1) postaci:

1gdy ,

gdy ),()/({)( ==+

= nc

bnndbnaT knT

Podstawy analizy algorytmów

(3.1)gdy ),()/( =+ bnndbnaT

Z równaniami takimi spotykamy się w przypadkupodziału problemu rozmiarun na a podproblemów, każdyrozmiarun/b. Takie podejście do rozwiązywania trudnychproblemówobliczeniowych nosi nazwę dziel i rządź.

Rozwiązując metodą wielokrotnego podstawiania, otrzymujemy:

T(n) = aT(n/b) + d(n)

= a(aT(n/b2) + d(n/b)) + d(n) = a2T(n/b2) + ad(n/b) + d(n)

Podstawy analizy algorytmów

= a(aT(n/b ) + d(n/b)) + d(n) = a T(n/b ) + ad(n/b) + d(n)

= a3T(n/b3) + a2d(n/b2) + ad(n/b) + d(n)

= . . .

= aiT(n/bi) + dla pewnego i ≤ k, gdziek = logb nΣ−

=

1

0

)/(i

j

jj bnda

Korzystając z faktu, że T(n/bk) = T(l) = c, otrzymujemy równanie (3.2):

Σ−

=

−+=1

0

)()(k

j

jkjk bdacanT

Podstawy analizy algorytmów

(3.2) =0j

Równanie ogólne

Rozwiązanie jednorodne d(n)– f. wiodąca

Rozwiązanie szczegółowe

k = logbn. Wówczas pierwszy wyraz można zapisać jakoca lub cn. A więc jest to składnik wielomianowy.

Dla przykładu, gdya = b = 2, toak = n i cak = O(n). Ogólnie, imwiększe jesta, tzn. im więcej trzeba rozwiązać podproblemów, tymwiększy będzie wykładnik. Podobnie imwiększe jestb, to znaczy immniejsze będą poszczególnepodproblemy, tym mniejszy będzie

Podstawy analizy algorytmów

logbalogbn

mniejsze będą poszczególnepodproblemy, tym mniejszy będziewykładnik.

Pierwsze wyrażenie ze wzoru (3.2), czyli cak lubcn nazywamyrozwiązaniemjednorodnym. Rozwiązanie to byłobyrozwiązaniemogólnym, czyli rozwiązaniemcałości, gdyby funkcjad(n) = 0 dla wszystkichn. Funkcję d(n) nazywamyfunkcją wiodącą.Rozwiązanie jednorodne reprezentuje koszt rozwiązywaniawszystkich podproblemów.

log ba

Podstawy analizy algorytmów

Drugi człon (3.2) nazywamyrozwiązaniem szczegółowym.Rozwiązanie to jest zależne od funkcji wiodącej i od parametrówa i b. Gdy rozwiązanie jednorodne dominuje nad funkcją wiodącą,to rozwiązanie szczegółowe ma identyczne tempo wzrostu jakrozwiązanie jednorodne i tymsamymwszystkie trzy rozwiązania:ogólne, szczegółowe i jednorodne mają asymptotycznie takie samotempo wzrostu.

Oszacujemy tempo wzrostu rozwiązania szczegółowego wprzypadku ogólnym. W tym celu przyjmiemy pewne uproszczeniedotyczące funkcji wiodącej. Zakładamy mianowicie,że d(n) jestfunkcją iloczynową, tzn. taką, że f(xy) = f(x)f(y) dla wszystkichx,y ∈ N. Dla przykładu, funkcja typunα jest iloczynowa, ponieważdla f(n) = nα mamy (xy)α = xαyα. Tak więc, skoro funkcjad(n) jestiloczynowa,to d(bk–j) = d(b)k/d(b)j = d(b)k−j. Zatemwzór (3.3) :

Podstawy analizy algorytmów

iloczynowa,to d(bk–j) = d(b)k/d(b)j = d(b)k−j. Zatemwzór (3.3) :

1)(/

)(

1)(/

1))(/()(

)()()(

1

0

1

0 −−=

−−==Σ Σ

=

=

bda

bda

bda

bdabd

bd

abdbda

kkkk

jk

j

k

j

kjkj

o ile a ≠ d(b).

( )

Rozważmy trzy przypadki szczególne

1. Gdy a > d(b), to wyrażenie (3.3) jest O(ak). W tym przypadkuoba rozwiązania składowe są tego samego rzędu, gdyż sązdominowane przezak = nlogba, które zależy jedynie od wartości ai b. Zmniejszanie funkcjid(n) jest tu bezcelowe.

Podstawy analizy algorytmów

2. Gdy a < d(b), to (3.3) jest O(d(b)k), lub co równoważneO(nlogbd(b)). W tym przypadku rozwiązanie szczegółowe dominujenad jednorodnym. Dlatego wszelkie ulepszeniaT(n) mogąpochodzić od zmniejszeniad(n) i b. Zwróćmy uwagę na ważnyprzypadek szczególny, taki jak w przykładzie, czylid(n) = nα.Wówczas d(b) = bα i logb(b

α) = α. Zatem rozwiązanieszczegółowe i ogólne jest O(nα) = O(d(n)).

3. Gdy a = d(b), to we wzorze (3.3) mamy dzielenie przez zero.Zatem rozwiązanie szczegółowe winniśmy oszacować inaczej.Mianowicie wzorem(3.4):

Σ Σ Σ− − −

− ====1 1

)(log1

log)(1)()()(k k

bbdk

kk

jkjkj nnkbdbd

abdbda b

Podstawy analizy algorytmów

( )Σ Σ Σ= = =

====0 0 0

log)(1)()(

)()(j j

bk

j

kkjkj nnkbdbdbd

bdbda b

Skoro a = d(b), to rozwiązanie (3.4) jest logbn razy większe odjednorodnego i ponownie dyktuje rozwiązanie ogólne. Wpowyższym przypadku szczególnym, gdyd(n) = nα, to mamyd(b) = bα, więc (3.4) sprowadza się do O(d(n)⋅logn).

( )

Twierdzenie 3.1. Niech a i b będą stałymi dodatnimi, zaś d(n)funkcją iloczynową. Rozwiązaniemrównania rekurencyjnego postaci

==

+Θ=

kbn

n

ndbnaTnT

gdy

1gdy

),()/(

),1()(

gdzie k jest liczbą naturalną, jest funkcja

Podstawy analizy algorytmów

{

Σ−

=

−+Θ=1

0

)()()(k

j

jkjk bdaanT

o wartościach

>=<

ΘΘΘ

=)(gdy

)(gdy

)(gdy

),(

),log(

),(

)(log

log

)(log

bda

bda

bda

n

nn

n

nTa

a

bd

b

b

b

{

Przykład

Rozważmy następujące równania rekurencyjne:

1) T(n) = 4T(n/2) + n

2) T(n) = 4T(n/2) + n2

Podstawy analizy algorytmów

2) T(n) = 4T(n/2) + n2

3) T(n) = 4T(n/2) + n3

przy czymw każdymprzypadkuT(l) = 1.

Podstawy analizy algorytmów

Zauważmy, że a = 4, b = 2, więc rozwiązanie jednorodnewynosi dokładnienlg4, czyli n2.

1. W pierwszymrównaniu mamyd(n) = n, czyli d(b) = 2. Ponieważ4 = a > d(b) = 2, więc rozwiązanie szczegółowe jest równieżkwadratowe. ZatemT(n) = Θ(n2).

2. W drugim równaniumamyd(b) = d(2) = 4 = a, więc stosujemy2. W drugim równaniumamyd(b) = d(2) = 4 = a, więc stosujemywzór 3.4. Ponieważ d(n) jest postaci nα, więc rozwiązanieszczegółowe i tymsamym T(n) są postaci Θ(n2log n). W tymprzypadku możemy również napisać, żeT(n) = (n2).

3. W trzecim równaniu mamyd(n) = n3 i d(b) = d(2) = 8, czylia < d(b). Przeto rozwiązanie szczegółowe jest O(nlogbd(b)) = O(n3) irównież T(n) = Θ(n3). Widzimy zatem,że w istocie rozwiązanieszczegółowe jest tego samego rzędu co d(n) = n3, a więc że jestzdeterminowane funkcją wiodącą.

Przykład sortowania przez scalanie

W przypadku procedury sortowania przez scalanie możemy napisać w formule (2.1) znak „=” ponieważ wiemy, że scalanie nie może być wykonywane szybciej niż w czasie proporcjonalnym do sumy długości obydwu list. Mamy

Widzimy, że funkcja wiodąca nie jest iloczynowa. Dlatego podstawiamy

>+=

=1if)2/(2

1if)(

2

1

nncnT

ncnT

./)2/()2/(,//)1()1( 2212 cnTnUccccTU ====

0dla)()( 2 ≥= nnUcnT

W ten sposób T(n) = 2T(n/2)+c2n przechodzi obecnie w

W konsekwencji musimy rozwiązać równanie

./)2/()2/(,//)1()1( 2212 cnTnUccccTU ====

.)2/(2)( 222 ncnUcnUc +=

>+=

=1if)2/(2

1if)(

nnnU

ncnU

)log()(

)log()log()( 2log2

nnnT

nnnnnU

Θ=Θ=Θ=

Rozważmy następujący algorytm rekurencyjny przeszukującywektorA[1..n].

procedureFindMin(A: wektor; n, k: int);begin

Podstawy analizy algorytmów

RównaniaRównania rekurencyjnerekurencyjne typu „jeden krok w tył”typu „jeden krok w tył”

beginif n = 1 then k:= 1else begin

FindMin(A, n–1, k);if A[n] < A[k] then k:=n

endend;

Takie równanianiejednorodnepojawiają się na przykładprzy

1ngdy ,1gdy ),()1({)( =

>+−= cnndnaTnT

Podstawy analizy algorytmów

Rozważmy rekurencyjne równanie niejednorodne (3.5) postaci:

(3.5)

Takie równanianiejednorodnepojawiają się na przykładprzyrekurencyjnym rozwiązywaniu problemówwykładniczych, gdydla rozwiązania problemu rozmiarun korzystamy z rozwiązaniapodproblemu rozmiarun – l. Równania typu „jeden krok w tył”nazywamy formalnie równaniami rekurencyjnymipierwszegorzędu, ponieważ nowa wartość ciągu jest obliczana na podstawietylko jednej wartości bezpośrednio poprzedzającej.

Równanie wcześniejsze moglibyśmy próbować rozwiązać jakpoprzednio metodą wielokrotnego podstawiania, jednakże szybkootrzymalibyśmy bardzo skomplikowaną formułę. Dlatego dokonamynajpierwpodstawienia

T(n) = anU(n) dla n ≥ 0,

otrzymując

Podstawy analizy algorytmów

otrzymując

anU(n) = a(an–1)U(n – 1) + d(n),

czyli

U(n) = U(n – 1) + d(n)/an.

Przyjmując dla uproszczenia,że e(n) = d(n)/an dla n = 1, 2, ...,otrzymujemy uproszczoną postać

U(n) = U(n – 1) + e(n).

Rozwiązanie dalsze równania jest już dość łatwe. Mianowicie:

U(1) = c + e(l)

U(2) = U(l) + e(2) = (c + e(l)) + e(2)

U(3) = U(2) + e(3) = (c + e(l) + e(2)) + e(3)

Podstawy analizy algorytmów

U(3) = U(2) + e(3) = (c + e(l) + e(2)) + e(3)

.

.

.

U(n) = c + e(l) + e(2) + ...+e(n) = Σ=

+n

jjec

1)(

Σ=

−+=n

j

jnn jdacanT1

)()(

Równanie ogólne Rozwiązanie

Podstawy analizy algorytmów

Cofnijmy się, aby wyrazić nasze rozwiązanie w terminachzmiennychT(n).

Ogólne rozwiązanie równania niejednorodnego jest sumąrozwiązania jednorodnego, uzyskanego przy założeniu, że funkcjawiodąca d(n) = 0, i rozwiązania szczegółowego. Rozwiązanie to jestΘ(an), gdy rozwiązanie jednorodne dominuje nad tempemwzrostusumy szeregu związanego zd(n).

ogólne

Rozwiązanie jednorodne

Rozwiązanie szczegółowe

Oszacujmy tempo wzrostu rozwiązania szczegółowego. Wtym celu założymy, że funkcja wiodąca jest monotonicznawzględeman, tzn.d(n)/an jest funkcją niemalejącą lub nierosnącą.Poniżej rozważymy cztery przypadki szczególne.

Podstawy analizy algorytmów

1. Gdy d(n) = O(an/nε), ε > 1, to dla każdego j = 1,..., n istniejestałac taka,żed(j)jε < caj.stałac taka,żed(j)jε < caj.

Zatemd(l)/a1 +...+ d(n)/an < c(1/1ε +...+ 1/nε) ≤ cc', gdziec' jestgranicą szeregu, gdyż szereg harmoniczny rzędu ε > 1 jestzbieżny. Obecnie mnożąc obustronnie przezan, otrzymujemyd(l)an−l +...+ d(n)a0 < cc'an = Θ(an). Ponieważ can jest równieżrzęduΘ(an), więc T(n) = can + Θ(an) = Θ(an).

2. Gdy d(n) = o(an), to dla każdegoi = 1,...,n d(i)/ai < ci, gdzieci sąstałymi takimi,żeci > ci+1 oraz limci = 0.

Zatem d(l)/a1 +...+ d(n)/an < (cl+...+cn) = o(n), gdyż średniaarytmetyczna ciągu dąży do zera, gdy ciąg zmierza do zera. Czylid(l)an–l +...+ d(n)a0 = o(nan). Ponieważ rozwiązanie jednorodnecan = o(nan), więc T(n) = o(nan).

Podstawy analizy algorytmów

can = o(nan), więc T(n) = o(nan).

3. Gdy d(n) = Θ(an), to istnieją stałecl i c2 takie,że dla wszystkichj mamy c1 ≤ d(j)/aj ≤ c2, czyli cln ≤ d(l)/a +...+ d(n)/an ≤ c2n.Mnożąc obustronnie powyższe nierówności przezan, otrzymujemyd(l)an–l +...+d(n)a0 = Θ(nan).

Zatem rozwiązanie szczegółowe dominuje nad jednorodnymi wkonsekwencjiT(n) = Θ(nan).

4. Gdy d(n) = ω(an), to rozpatrzymy dwa przypadki. Jeżeli a = 1,to d(l)an–l +...+ d(n)a0 = d(l) +...+ d(n) ≤ nd(n). Jeżeli a > 1, tod(n) = anf(n), gdzie f(n) jest funkcją niemalejącą. Dlatego dlakażdegoj d(j)an–j = ajf(j)an–j = anf(j) ≤ anf(n) ≤ d(n). Wobec tegod(l)an–l +...+ d(n)a0 ≤ nd(n) = O(nd(n)).

Podstawy analizy algorytmów

d(l)a +...+ d(n)a ≤ nd(n) = O(nd(n)).

Zatem rozwiązanie szczegółowe ponownie dominuje nadjednorodnym, czyliT(n) = O(nd(n)).

Twierdzenie 3.2. Niech a będzie stałą taką, że a≥ 1, zaś d(n) funkcjąmonotoniczną względeman. Rozwiązaniemrównania rekurencyjnegopostaci

jestfunkcja

>=

+−Θ=

1gdy

1gdy

),()1(

),1()(

n

n

ndnaTnT

Podstawy analizy algorytmów

{jestfunkcja

o wartościach

Σ=

−+Θ=n

j

jnn jdaanT1

)()()(

==

>=Θ=

)(ω)(gdy

)(O)(gdy

1ε),/(O)(gdy

)),((O

),(O

),(

)(

ε

n

n

n

n

n

and

and

nand

nnd

na

a

nT {

Rozważmy problem wież w Hanoi. Jest to łamigłówkawymyślona przez E. Lucasa w 1883r., złożona z trzechpionowych pałeczek i różnej wielkości krążków, którenasadzono na pierwszą z nich w ten sposób,że średnicekrążków rosną ku podstawie. Zadanie polega na przeniesieniun krążków z pierwszejpałeczkina trzecią przy ograniczeniu,

Podstawy analizy algorytmów

n krążków z pierwszejpałeczkina trzecią przy ograniczeniu,że w jednymkroku przenosimy tylko jeden krążek i nie wolnokłaść krążka o większej średnicy na krążek o mniejszejśrednicy. Druga pałeczka spełnia rolę pomocniczą. Łatwozauważyć, że liczba przeniesień podwaja się przy wzrościeliczby krążków o 1. Zatem czas działania odpowiedniegoalgorytmu rośnie proporcjonalnie do funkcji 2n.

Podstawy analizy algorytmów

procedureHanoi (A,B,C: pałeczka; n: integer);begin

if n = 1 then przenieś (A,C)else begin

Hanoi (A,C,B, n–1);przenieś (A,C);Hanoi (B,A,C, n–1);

end

Problem wież w Hanoi

endend;

=+−

= 1gdy)1(

1)( n1 n2T

nT {

Stosując twierdzenie (3.2) (przypadek 1) otrzymujemyT(n) = Θ(2n)

Łatwo zauważyć, że

gdy n > 1

KONIECKONIEC