Can not figure out complexity of this recurrence

懵懂的女人 提交于 2019-12-01 22:20:37

ah, enough with the hints. the solution is actually quite simple. z-transform both sides, group the terms, and then inverse z transform to get the solution.

first, look at the problem as

    x[n] = a x[n-1] + c

apply z transform to both sides (there are some technicalities with respect to the ROC, but let's ignore that for now)

    X(z) = (a X(z) / z) + (c z / (z-1))

solve for X(z) to get

    X(z) = c z^2 / [(z - 1) * (z-a)]

now observe that this formula can be re-written as:

    X(z) = r z / (z-1) + s z / (z-a)

where r = c/(1-a) and s = - a c / (1-a)

Furthermore, observe that

    X(z) = P(z) + Q(z)

where P(z) = r z / (z-1) = r / (1 - (1/z)), and Q(z) = s z / (z-a) = s / (1 - a (1/z))

apply inverse z-transform to get that:

    p[n] = r u[n] 

and

    q[n] = s exp(log(a)n) u[n]

where log denotes the natural log and u[n] is the unit (Heaviside) step function (i.e. u[n]=1 for n>=0 and u[n]=0 for n<0).

Finally, by linearity of z-transform:

    x[n] = (r + s exp(log(a) n))u[n]

where r and s are as defined above.

so relabeling back to your original problem,

    T(n) = a T(n-1) + c

then

    T(n) = (c/(a-1))(-1+a exp(log(a) n))u[n]

where exp(x) = e^x, log(x) is the natural log of x, and u[n] is the unit step function.

What does this tell you?

Unless I made a mistake, T grows exponentially with n. This is effectively an exponentially increasing function under the reasonable assumption that a > 1. The exponent is govern by a (more specifically, the natural log of a).

One more simplification, note that exp(log(a) n) = exp(log(a))^n = a^n:

    T(n) = (c/(a-1))(-1+a^(n+1))u[n]

so O(a^n) in big O notation.

And now here is the easy way:

put T(0) = 1

    T(n) = a T(n-1) + c

    T(1) = a * T(0) + c = a + c
    T(2) = a * T(1) + c = a*a + a * c + c
    T(3) = a * T(2) + c = a*a*a + a * a * c + a * c + c
    ....

note that this creates a pattern. specifically:

    T(n) = sum(a^j c^(n-j), j=0,...,n)

put c = 1 gives

    T(n) = sum(a^j, j=0,...,n)

this is geometric series, which evaluates to:

    T(n) = (1-a^(n+1))/(1-a)
         = (1/(1-a)) - (1/(1-a)) a^n
         = (1/(a-1))(-1 + a^(n+1))

for n>=0.

Note that this formula is the same as given above for c=1 using the z-transform method. Again, O(a^n).

Don't even think about Master's Theorem. You can only use Masther's Theorem when you're given master's theorem when b > 1 from the general form T(n) = aT(n/b) + f(n).

Instead, think of it this way. You have a recursive call that decrements the size of input, n, by 1 at each recursive call. And at each recursive call, the cost is constant O(1). The input size will decrement until it reaches 1. Then you add up all the costs that you used to make the recursive calls. How many are they? n. So this would take O(2^n).

Jens Hoffmann

Looks like you can't formulate this problem in terms of the Master Theorem.

A good start is to draw the recursion tree to understand the pattern, then prove it with the substitution method. You can also expand the formula a couple of times and see where it leads.

See also this question which solves 2 subproblems instead of a: Time bound for recursive algorithm with constant combination time

Chaitra Suresh

May be you could think of it this way

when

n = 1, T(1) = 1
n = 2, T(2) = 2
n = 3, T(3) = 4
n = 4, T(4) = 8
n = 5, T(5) = 16

It is easy to see that this is a geometric series 1 + 2+ 4+ 8 + 16..., the sum of which is first term (ratio^n - 1)/(ratio - 1). For this series it is

1 * (2^n - 1)/(2 - 1) = 2^n - 1.

The dominating term here is 2^n, therefore the function belongs to Theta(2^n). You could verify it by doing a lim(n->inf) [2^n / (2^n - 1)] = +ve constant.

Therefore the function belongs to Big Theta (2^n)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!