johnchen902 jest poprawne:
alg(n)=Θ(φ^n)
gdzie φ = Golden ratio = (1 + sqrt(5))/2
ale jego argument jest zbyt ręcznie zawijania, tak zróbmy to surowo. Jego pierwotny argument był niekompletny, dlatego dodałem moje, ale teraz he has completed the argument.
loop body = Θ(3n+1)
Oznaczmy koszty ciała pętli dla argumentu n
z g(n)
.Następnie g(n) ∈ Θ(n)
od Θ(n) = Θ(3n+1)
.
Ponadto, niech T(n)
będzie całkowity koszt alg(n)
dla n >= 0
. Następnie dla n >= 2
mamy nawrót
T(n) = T(n-1) + T(n-2) + g(n)
Dla n >= 3
możemy wstawić nawrotom zastosowany do T(n-1)
do tego,
T(n) = 2*T(n-2) + T(n-3) + g(n) + g(n-1)
i n > 3
, możemy kontynuować, stosując nawrót do T(n-2)
. W przypadku dostatecznie dużej n
, dlatego mają
T(n) = 3*T(n-3) + 2*T(n-4) + g(n) + g(n-1) + 2*g(n-2)
= 5*T(n-4) + 3*T(n-5) + g(n) + g(n-1) + 2*g(n-2) + 3*g(n-3)
...
k-1
= F(k)*T(n+1-k) + F(k-1)*T(n-k) + ∑ F(j)*g(n+1-j)
j=1
n-1
= F(n)*T(1) + F(n-1)*T(0) + ∑ F(j)*g(n+1-j)
j=1
z Fibonacciego F(n)
[F(0) = 0, F(1) = F(2) = 1
].
i T(1)
to niektóre stałe, więc pierwsza część to oczywiście Θ(F(n))
. Pozostaje zbadać kwotę.
Od g(n) ∈ Θ(n)
, musimy tylko do zbadania
n-1
A(n) = ∑ F(j)*(n+1-j)
j=1
Teraz
n-1
A(n+1) - A(n) = ∑ F(j) + (((n+1)+1) - ((n+1)-1))*F((n+1)-1)
j=1
n-1
= ∑ F(j) + 2*F(n)
j=1
= F(n+1) - 1 + 2*F(n)
= F(n+2) + F(n) - 1
Reasumując, że wychodząc z A(2) = 2 = F(5) + F(3) - 5
otrzymujemy
A(n) = F(n+3) + F(n+1) - (n+3)
a zatem z
c*n <= g(n) <= d*n
szacunek
F(n)*T(1) + F(n-1)*T(0) + c*A(n) <= T(n) <= F(n)*T(1) + F(n-1)*T(0) + d*A(n)
dla n >= 2
. Od F(n+1) <= A(n) < F(n+4)
wszystkie terminy w zależności od n
w lewej i prawej części nierówności to Θ(φ^n)
, q.e.d.
Jest to podobne do złożoności [rekurencyjnej sekwencji Fibonacciego] (http://stackoverflow.com/q/360748/1805388). – ValarDohaeris
Nie jestem tego taki pewien. Chodzi mi o to, że łatwo jest obliczyć złożoność Fibonacciego, ale teraz z tą ciałem pętli = Θ (3n + 1) czyni to znacznie trudniejszym. – user2147971
Jaki jest twój stan terminala? – johnchen902