Time Complexity Solution - algorithm

Help me solve this recurrence relation
T(n) = 8T(n/2) + qn , n > 1
= p , n = 1
Answer is : n^3
Please solve by back substitution method.
The following is my attempt for the question.

You are doing right:
T(n) = 8T(n/2) + qn
=> T(n) = 8(8T(n/4) + q(n/2)) + qn = 8^2 T(n/2^2) + q(n + 8 * n/2)
=> T(n) = 8^2‌(8T(n/2^3) + q(n/2^2)) + q(n + 8 * n/2)
= 8^3 T(n/2^3) + q ( n + 8 * n/2 + 8^2 * n/2^2)
Now by induction (if we suppose n = 2^k and T(1) = 1):
T(n) = q * sum_{i=0}^{k} 8^i * n / 2^i
Now, simplify the equation as we know 8^i / 2^i = 4^i and by factoring n from the summation, we have:
T(n) = q * n * sum_{i=0}^{k} 4^i = q * n * (4^k - 1)
As 4^k = 2^{2k} = (2^k)^2 = n^2, we can write:
T(n) = q * n * (n^2 - 1) = Theta(n^3)

Related

Recursion Tree Method to solve a Recurrence equation

How to solve the recurrence relation T(n)= 2T(n/2) + nlogn using recursion tree?
After expansion we will have:
T(n) = 2(2T(n/2^2) + n/2 log(n/2)) + nlog(n) = 2^2 T(n/2^2) + n log(n/2) + n log(n)
= 2^2(2T(n/2^3) + n/2^2 + log(n/2^2)
= 2^3T(n/2^3) + nlog(n/2^2) + n log(n/2) + n log(n)
Hence, using induction, we will have:
T(n) = n ( log(n) + log(n/2) + log(n/2^2) + ... + log(n/2^log(n)))
= n log(n * n/2 * n/2^2 * ... * n/2^log(n))
= n log(n^log(n) / 2^(1 + 2 + ... + log(n)))
= n log(n^log(n) / 2^(log(n)*(log(n)+1)/2)
= n log((n^2 / 2^(log(n)+1)) ^ (log(n)/2))
= n (log(n)/2) log(n^2 / 2n) = Theta(n (log(n))^2)

Solving recurrence relations where they cannot be easily put in MT form

I have the following recurrence relation:
T(n) = T(n/2) + T(n/2) + n
In this instance, I believe the solution is found by:
T(n) = T(n/2) + T(n/2) + n = 2T(n/2) + n
Here, the Master Theorem can be applied:
a = b = 2, f(n) = n
n^(log2(2)) vs n --> n vs n
Thus, the solution would be:
Theta(n log n)
How would I find the solution for the following situations:
T(n) = T(n/2) + T(n/4) + n
T(n) = T(n/2) + T(n/3) + n^2
Those don't look like they can be easily put into MT form, so I am not quite sure what to do.
Those are of a form that can be handled by Akra--Bazzi: https://en.m.wikipedia.org/wiki/Akra%E2%80%93Bazzi_method
Since T(n) = T(n/2) + T(n/4) + n satisfies the criteria of Akra-Bazzi method[see CRLS, pages 112 - 113 ], than you can use that method to solve the recurrence.
To solve the recurrence, we first need to find the unique real number p such that
(1/2)^p + (1/4)^p = 1
<=> (1/2)^p + (1/2^2)^p = 1
<=> (1/2)^p + (1/2)^2p = 1
<=> (1/2)^p * [1 + (1/2)^p] = 1
Let x = (1/2)^p, then we have an equation of the following form
x * (1 + x) = 1
<=> x + x^2 = 1
<=> x^2 + x - 1 = 0
=> x = (-1 + sqrt(5)) / 2 -> x = 1
=> (1/2)^p = 1
<=> (1/2)^p = (1/2)^0
<=> p = 0
The solution to the recurrence is then
T(n) = 𝚯(x^p * (1 + integral-from-1-to-n-(u/u^(p+1))du))
<=> T(n) = 𝚯(x^0 * (1 + integral-from-1-to-n-(u/u^(0+1))du))
<=> T(n) = 𝚯(1 * (1 + integral-from-1-to-n-(1)du))
<=> T(n) = 𝚯(1 * (1 + (n - 1)))
<=> T(n) = 𝚯(1 * (n))
<=> T(n) = 𝚯(n)
The same way can you solve T(n) = T(n/2) + T(n/3) + n^2

Recurrence relation T(n) = 3T(n-1) + n

I'm trying to solve the recurrence relation T(n) = 3T(n-1) + n and I think the answer is O(n^3) because each new node spawns three child nodes in the recurrence tree. Is this correct? And, in terms of the recurrence tree, is there a more mathematical way to approach it?
Recurrence equations are just math: Unfold, sum up and simplify.
T(n) = 3T(n-1) + n = 3 (3 T(n - 2) + (n-1)) + n
= 3^2 T(n - 3) + 3^2(n-2) + 3(n-1) + n)
= ...
= 3^i T(n - i) + Σ_(j=0..i-1) 3^j * (n-j)
= Σ_(j=0..n-1) 3^j * (n-j) // assuming T(0) = 0
Now we can find different upper bounds depending on how we much we want to think about it:
T(n) = Σ_(j=0..n-1) 3^j * (n-j)
< n * Σ_(j=0..n-1) 3^j
= n * (3^n - 1)
So T(n) = O(n*3^n).
You can also get a tighter bound by splitting the sum up into two parts:
T(n) = Σ_(j=0..n-1) 3^j * (n-j)
< n * Σ_(j=0..n-x) 3^j * (n-j) + x * Σ_(j=n-x..n-1) 3^j
= n (3^(n-x+1) - 1) + x * (3^n - 3^(n-x+1))
using x = log_3(n) you get T(n) = O(3^n * log(n)).
You can also approximate the sum Σ(n-i)3^i using an integral and get the exact complexity Θ(3^n).

Solving the similar recurrence: T(n) = 3T(n/3) + n/3

Given..
T(0) = 3 for n <= 1
T(n) = 3T(n/3) + n/3 for n > 1
So the answer's suppose to be O(nlogn).. Here's how I did it and it's not giving me the right answer:
T(n) = 3T(n/3) + n/3
T(n/3) = 3T(n/3^2) + n/3^2
Subbing this into T(n) gives..
T(n) = 3(3T(n/3^2) + n/3^2) + n/3
T(n/3^2) = 3(3(3T(n/3^3) + n/3^3) + n/3^2) + n/3
Eventually it'll look like..
T(n) = 3^k (T(n/3^k)) + cn/3^k
Setting k = lgn..
T(n) = 3^lgn * (T(n/3^lgn)) + cn/3^lgn
T(n) = n * T(0) + c
T(n) = 3n + c
The answer's O(n) though..What is wrong with my steps?
T(n) = 3T(n/3) + n/3
T(n/3) = 3T(n/9) + n/9
T(n) = 3(3T(n/9) + n/9) + n/3
= 9T(n/9) + 2*n/3 //statement 1
T(n/9)= 3T(n/27) + n/27
T(n) = 9 (3T(n/27)+n/27) + 2*n/3 // replacing T(n/9) in statement 1
= 27 T (n/27) + 3*(n/3)
T(n) = 3^k* T(n/3^k) + k* (n/3) // eventually
replace k with log n to the base 3.
T(n) = n T(1) + (log n) (n/3);
// T(1) = 3
T(n) = 3*n + (log n) (n/3);
Hence , O (n* logn)
Eventually it'll look like.. T(n) = 3^k (T(n/3^k)) + cn/3^k
No. Eventually it'll look like
T(n) = 3^k * T(n/3^k) + k*n/3
You've opened the parenthesis inaccurately.
These types of problems are easily solved using the masters theorem. In your case a = b = 3, c = log3(3) = 1 and because n^c grows with the same rate as your f(n) = n/3, you fall in the second case.
Here you have your k=1 and therefore the answer is O(n log(n))
This question can be solved by Master Theorem:
In a recursion form :
where a>=1, b>1, k >=0 and p is a real number, then:
if a > bk, then
if a = bk
a.) if p >-1, then
b.) if p = -1, then
c.) if p < -1, then
3. if a < bk
a.) if p >=0, then
b.) if p<0, then T(n) = O(nk)
So, the above equation
T(n) = 3T(n/3) + n/3
a = 3, b = 3, k =1, p =0
so it fall into 2.a case, where a = bk
So answer will be
O(n⋅log(n))

solving recurrence T(n) = T(n/2) + T(n/2 - 1) + n/2 + 2

Need some help on solving this runtime recurrence, using Big-Oh:
T(n) = T(n/2) + T(n/2 - 1) + n/2 + 2
I don't quite get how to use the Master Theorem here
For n big enough you can assume T(n/2 - 1) == T(n/2), so you can change
T(n) = T(n/2) + T(n/2 - 1) + n/2 + 2
into
T(n) = 2*T(n/2) + n/2 + 2
And use Master Theorem (http://en.wikipedia.org/wiki/Master_theorem) for
T(n) = a*T(n/b) + f(n)
a = 2
b = 2
f(n) = n/2 + 2
c = 1
k = 0
log(a, b) = 1 = c
and so you have (case 2, since log(a, b) = c)
T(n) = O(n**c * log(n)**(k + 1))
T(n) = O(n * log(n))

Resources