Upload
vkajnskvja
View
169
Download
0
Embed Size (px)
Citation preview
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