0% found this document useful (0 votes)
112 views42 pages

Recurrences PDF

The document discusses analyzing the running time of recursive algorithms using recurrence relations. It presents three methods for solving recurrence relations: substitution, iteration/recursion trees, and the master method. The substitution method involves guessing the order of growth, verifying it using mathematical induction, and identifying constants. The iteration method builds a recursion tree to derive a closed-form solution. Both methods are demonstrated on the example recurrence T(n) = n + 4T(n/2), which is solved to be Θ(n2).

Uploaded by

kawchar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
112 views42 pages

Recurrences PDF

The document discusses analyzing the running time of recursive algorithms using recurrence relations. It presents three methods for solving recurrence relations: substitution, iteration/recursion trees, and the master method. The substitution method involves guessing the order of growth, verifying it using mathematical induction, and identifying constants. The iteration method builds a recursion tree to derive a closed-form solution. Both methods are demonstrated on the example recurrence T(n) = n + 4T(n/2), which is solved to be Θ(n2).

Uploaded by

kawchar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Recurrences

Objective
• running time as recursive function
• solve recurrence for order of growth
• method: substitution
• method: iteration/recursion tree
• method: MASTER method
• prerequisite:
- mathematical induction, recursive definitions
- arithmetic manipulations, series, products
Pipeline
Problem

Algorithm

Running Time
Recursion

Solve Recursion
Running time
• will call it T(n) = number of computational steps
required to run the algorithm/program for input of
size n
• we are interested in order of growth, not exact
values
- for example T(n) = Θ(n2) means quadratic running time
- T(n) = O(n logn) means T(n) grows not faster than CONST*n*log(n)

• for simple problems, we know the answer right away


- example: finding MAX of an array
- solution: traverse the array, keep track of the max encountered
- running time: one step for each array element, so n steps for array
of size n; linear time T(n) = Θ(n)
Running time for complex problems

• complex problems involve solving subproblems, usually


- init/prepare/preprocess, define subproblems
- solve subproblems
- put subproblems results together

• thus T(n) cannot be computed straight forward


- instead, follow the subproblem decomposition
Running time for complex problems
• often, subproblems are the same problem for a
smaller input size:
- for example max(array) can be solved as:
- split array in array_Left, array_Right
- solve max(array_Left), max (array_Right)
- combine results to get global max
‣ Max(A=[a1,a2,... ,an])
‣ if (n==1) return a1
‣ k= n/2
‣ max_left = Max([a1,a2,..,ak])
‣ max_right = Max([ak+1,ak+2,..,an])
‣ if(max_left>max_right) return max_left
‣ else return max_right

• T(n) = 2*T(n/2) + O(1)


Running time for complex problems

• many problems can be solved using a divide-and-


conquer strategy
- prepare, solve subproblems, combine results

• running time can be written recursively


- T(n) = time(preparation) + time(subproblems) + time(combine)
- for MAX recursive: T(n) = 2*T(n/2) + O(1)
Running time for complex problems

• many problems can be solved using a divide-and-


conquer strategy
- prepare, solve subproblems, combine results

• running time can be written recursively


- T(n) = time(preparation) + time(subproblems) + time(combine)
- for MAX recursive: T(n) = 2*T(n/2) + O(1)

2 subproblems of size n/2


max(array_Left) ; max(array_Right)
Running time for complex problems

• many problems can be solved using a divide-and-


conquer strategy
- prepare, solve subproblems, combine results

• running time can be written recursively


- T(n) = time(preparation) + time(subproblems) + time(combine)
- for MAX recursive: T(n) = 2*T(n/2) + O(1)

2 subproblems of size n/2 constant time to check the maximum


max(array_Left) ; max(array_Right) out of the two max Left and Right
Recurrence examples
• T(n) = 2T(n/2) + O(1)
• T(n)= 2T(n/2) + O(n)
- 2 subproblems of size n/2 each, plus O(n) steps to combine results

• T(n) = 4T(n/3) + n
- 4 subproblems of size n/3 each, plus n steps to combine results

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

- a subproblem of size n/4, another of size n/2; n2 to combine

• want to solve such recurrences, to obtain the order


of growth of function T
Substitution method
• T(n) = 4T(n/2) + n
• STEP1 : guess solution, order of growth T(n)= O(n ) 3

- that means there is a constant C and a starting value n0, such that
T(n)≤Cn3, for any n≥n0

• STEP2: verify by induction


- assume T(k)≤k3, for k<n
- induction step: prove that T(n)≤Cn3, using T(k)≤Ck3, for k<n
n
T (n) = 4T ( ) + n (1)
2
� n �3
≤ 4c +n (2)
2
c 3
= n +n (3)
2
3 c 3
= cn − ( n − n) (4)
2
3 c 3
≤ cn ; if n − n > 0, choose c ≥ 2 (5)
2
Substitution method
• STEP 3 : identify constants, in our case c=2 works
• so we proved T(n)=O(n ) 3

• thats correct, but the result is too weak


- technically we say the bound O(n3) "cubic" is too lose
- can prove better bounds like T(n) "quadratic" T(n)=O(n2)
- Our guess was wrong ! (too big)

• lets try again : STEP1: guess T(n)=O(n2)


• STEP2: verify by induction
- assume T(k)≤Ck2, for k<n
- induction step: prove that T(n)≤Cn2, using T(k)≤Ck2, for k<n
Substitution method
• Fallacious argument
T (n) =
n
4T ( ) + n (1)
2
� n �2
≤ 4c +n (2)
2
= cn2 + n (3)
= O(n2 ) (4)
≤ cn2 (5)

- cant prove T(n)=O(n2) this way: need same constant steps 3-4-5
- maybe its not true? Guess O(n2) was too low?
- or maybe we dont have the right proof idea

• common trick: if math doesnt work out, make a


stronger assumption (subtract a lower degree term)
- assume instead T(k)≤C1k2-C2k, for k<n
- then prove T(n)≤C1n2-C2n, using induction
Substitution method
n
T (n) = 4T ( ) + n
2
� � � �
n 2 n
≤ 4 c1 − c2 +n
2 2
2
= c1 n − 2c2 n + n
= c1 n2 − c2 n − (c2 n − n)
2
≤ c1 n − c2 n f or c2 > 1

• So we can prove
asymptotically correct ?
2
T(n)=O(n ), but is that

- maybe we can prove a lower upper bound, like O(nlogn)? NOPE

• to make sure its the asymptote, prove its also the


lower bound
- T(n) =Ω(n2) or there is a different constant d s.t. T(n) ≥ dn2
Substitution method: lower bound


n
induction step T (n) = 4T ( ) + n
2
� n �2
≥ 4d +n
2
2 2
= dn + n ≥ dn

• now we know its asymptotically close, T(n)=Θ(n2)


• hard to make the initial guess Θ(n2)
- need another method to educate our guess
Iteration method
n
T (n) = n + 4T ( )
2
n n 2 n
= n + 4( + 4T ( )) = n + 2n + 4 T ( 2 )
2 4 2
2 n n 2 3 n
= n + 2n + 4 ( 2 + 4T ( 3 )) = n + 2n + 2 n + 4 T ( 3 )
2 2 2
= ....
2 k−1 k n
= n + 2n + 2 n + ... + 2 n + 4 T( k )
2
k−1

i k n
= 2 n + 4 T ( k );
i=0
2
Iteration method
n
T (n) = n + 4T ( )
2
n n 2 n
= n + 4( + 4T ( )) = n + 2n + 4 T ( 2 )
2 4 2
2 n n 2 3 n
= n + 2n + 4 ( 2 + 4T ( 3 )) = n + 2n + 2 n + 4 T ( 3 )
2 2 2
= ....
2 k−1 k n
= n + 2n + 2 n + ... + 2 n + 4 T( k )
2
k−1

i k n
= 2 n + 4 T ( k );
i=0
2 n
want k = log(n) ⇔ k = 1
2
Iteration method
n
T (n) = n + 4T ( )
2
n n 2 n
= n + 4( + 4T ( )) = n + 2n + 4 T ( 2 )
2 4 2
2 n n 2 3 n
= n + 2n + 4 ( 2 + 4T ( 3 )) = n + 2n + 2 n + 4 T ( 3 )
2 2 2
= ....
2 k−1 k n
= n + 2n + 2 n + ... + 2 n + 4 T( k )
2
k−1

i k n
= 2 n + 4 T ( k );
i=0
2 n
want k = log(n) ⇔ k = 1
2
log(n)−1

= n 2i + 4log(n) T (1)
i=0
log(n)
2 −1
= n + n2 T (1)
2−1
= n(n − 1) + n2 T (1) = Θ(n2 )
Iteration method
n
T (n) = n + 4T ( )
2
n n 2 n
= n + 4( + 4T ( )) = n + 2n + 4 T ( 2 )
2 4 2
2 n n 2 3 n
= n + 2n + 4 ( 2 + 4T ( 3 )) = n + 2n + 2 n + 4 T ( 3 )
2 2 2
= ....
= 2
n + 2n + 2 n + ... + 2 k−1 k n
n + 4 T( k )
2 • math can be messy
=
k−1

i k n
2 n + 4 T ( k );
2
- recap sum, product, series,
logarithms
i=0 n

-
want k = log(n) ⇔ k = 1
2
iteration method good for
log(n)−1
� guess, but usually
= n 2i + 4log(n) T (1) unreliable for an exact
i=0
result
= n
2
2−1
log(n)
−1
+ n2 T (1) - use iteration for guess, and
substitution for proofs

• stopping condition
= n(n − 1) + n2 T (1) = Θ(n2 )

- T(...) = T(1), solve for k


Iteration method: visual tree
T (n)
+n

n n n n
T( ) T( ) T( ) T( ) +2n
2 2 2 2

n n n n n n n n n n n n n n n n
T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( )
4 4 4 4
+4n
4 4 4 4 4 4 4 4 4 4 4 4
Iteration method: visual tree
T (n)
+n

n n n n
T( ) T( ) T( ) T( ) +2n
2 2 2 2

n n n n n n n n n n n n n n n n
T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( )
4 4 4 4
+4n
4 4 4 4 4 4 4 4 4 4 4 4

• compute the tree depth: how many levels


till nodes become leaves T(1)? log(n)
• compute the total number of leaves T(1) in
the tree (last level): 4 log(n)

• compute the total additional work (right


side) n+2n+4n+... = n(n-1)
• add the work 4 + n(n-1) = Θ(n )
log(n) 2
Iteration Method : derivation
• T(n) = n2 + T(n/2) + T(n/4)
2 n n
T (n) = n + T ( ) + T ( )
2 4
2 n 2 n n n 2 n n
= n + ( ) + T( ) + T( ) + ( ) + T( ) + T( )
2 4 8 4 8 16
2 5 2 n n n
= n + n + T ( ) + 2T ( ) + T ( )
16 4 8 16
2 5 2 n 2 n n n 2 n n n 2
= n + n + ( ) + T ( ) + T ( ) + 2( ) + 2T ( ) + 2T ( ) + ( ) +
16 4 8 16 8 16 32 16
n n
T( ) + T( )
32 64
2 5 2 5 2 2 n n n n
= n + n + ( ) n + T ( ) + 3T ( ) + 3T ( ) + T ( )
16 16 8 16 32 64
Iteration Method : derivation
• T(n) = n2 + T(n/2) + T(n/4)
2 n n
T (n) = n + T ( ) + T ( )
2 4
2 n 2 n n n 2 n n
= n + ( ) + T( ) + T( ) + ( ) + T( ) + T( )
2 4 8 4 8 16
2 5 2 n n n
= n + n + T ( ) + 2T ( ) + T ( )
16 4 8 16
2 5 2 n 2 n n n 2 n n n 2
= n + n + ( ) + T ( ) + T ( ) + 2( ) + 2T ( ) + 2T ( ) + ( ) +
16 4 8 16 8 16 32 16
n n
T( ) + T( )
32 64
2 5 2 5 2 2 n n n n
= n + n + ( ) n + T ( ) + 3T ( ) + 3T ( ) + T ( )
16 16 8 16 32 64
Iteration Method : derivation
• T(n) = n2 + T(n/2) + T(n/4)
2 n n
T (n) = n + T ( ) + T ( )
2 4
2 n 2 n n n 2 n n
= n + ( ) + T( ) + T( ) + ( ) + T( ) + T( )
2 4 8 4 8 16
2 5 2 n n n
= n + n + T ( ) + 2T ( ) + T ( )
16 4 8 16
2 5 2 n 2 n n n 2 n n n 2
= n + n + ( ) + T ( ) + T ( ) + 2( ) + 2T ( ) + 2T ( ) + ( ) +
16 4 8 16 8 16 32 16
n n
T( ) + T( )
32 64
2 5 2 5 2 2 n n n n
= n + n + ( ) n + T ( ) + 3T ( ) + 3T ( ) + T ( )
16 16 8 16 32 64

2 5 2 5 2 2 n n n 2 n n n 2
= n + n +( ) n +T ( )+T ( )+( ) +3T ( )+3T ( )+3( ) +
16 16 16 32 8 32 64 16
n n n 2 n n n 2
3T ( ) + 3T ( ) + 3( ) + T ( ) + T( )+( )
64 128 32 128 256 64
Iteration Method : derivation
• T(n) = n2 + T(n/2) + T(n/4)
2 n n
T (n) = n + T ( ) + T ( )
2 4
2 n 2 n n n 2 n n
= n + ( ) + T( ) + T( ) + ( ) + T( ) + T( )
2 4 8 4 8 16
2 5 2 n n n
= n + n + T ( ) + 2T ( ) + T ( )
16 4 8 16
2 5 2 n 2 n n n 2 n n n 2
= n + n + ( ) + T ( ) + T ( ) + 2( ) + 2T ( ) + 2T ( ) + ( ) +
16 4 8 16 8 16 32 16
n n
T( ) + T( )
32 64
2 5 2 5 2 2 n n n n
= n + n + ( ) n + T ( ) + 3T ( ) + 3T ( ) + T ( )
16 16 8 16 32 64
5 2
2 5 2 2 n n n 2 n n n 2
= n + n +( ) n +T ( )+T ( )+( ) +3T ( )+3T ( )+3( ) +
16 16 16 32 8 32 64 16
n n n 2 n n n 2
3T ( ) + 3T ( ) + 3( ) + T ( ) + T( )+( )
64 128 32 128 256 64

2 5 2 5 2 2 5 3 2 n n n n
= n + n + ( ) n + ( ) n + T ( ) + 4T ( ) + 6T ( ) + 4T ( )+
16 16 16 16 32 64 128
n
T( )
256
Iteration Method : tree
T (n)

n
n T( )
T( ) 4
2

n n n n
T( ) T( ) T( ) T( )
4 8 8 16

n n n n n n n n
T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( )
8 16 16 32 16 32 32 64
Iteration Method : tree
+n2
T (n)

5 2
n + n
n T( ) 16
T( ) 4
2
� �2
5
n n n n + n2
T( ) T( ) T( ) T( ) 16
4 8 8 16
� �3
n n n n n n n n 5
T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) + n2
8 16 16 32 16 32 32 64 16
Iteration Method : tree
+n2
T (n)

5 2
n + n
n T( ) 16
T( ) 4
2
� �2
5
n n n n + n2
T( ) T( ) T( ) T( ) 16
4 8 8 16
� �3
n n n n n n n n 5
T( ) T( ) T( ) T( ) T( ) T( ) T( ) T( ) + n2
8 16 16 32 16 32 32 64 16

• depth : at most log(n)


• leaves: at most 2 = n; computational cost nT(1) =O(n)
log(n)

• work :
�∞
2 5 2 5 2 2 5 3 2 2 5 i 16 2
n + n + ( ) n + ( ) n + ... ≤ n ( ) = n = Θ(n2 )
16 16 16 16 11

• total Θ(n )
i=0
2
Master Theorem - simple

• simple general case T(n) = aT(n/b) + Θ(nc)


Master Theorem - simple

• simple general case T(n) = aT(n/b) + Θ(nc)


• c
R=a/b , compare R with 1, or c with logb(a)
Master Theorem - simple

• simple general case T(n) = aT(n/b) + Θ(nc)


• c
R=a/b , compare R with 1, or c with logb(a)
Master Theorem - simple

• simple general case T(n) = aT(n/b) + Θ(nc)


• c
R=a/b , compare R with 1, or c with logb(a)

- MergeSort T(n) = 2T(n/2) + Θ(n); a=2 b=2 c=1


case 2 ; T(n) = Θ(nlogn)
Master Theorem - simple

• simple general case T(n) = aT(n/b) + Θ(nc)


• c
R=a/b , compare R with 1, or c with logb(a)

- MergeSort T(n) = 2T(n/2) + Θ(n); a=2 b=2 c=1


case 2 ; T(n) = Θ(nlogn)
- Strassen's T(n) =7T(n/2) + Θ(n2) ; a=7 b=2 c=2
case 1, T(n)= Θ(nlog2(7))
Master Theorem - simple

• simple general case T(n) = aT(n/b) + Θ(nc)


• c
R=a/b , compare R with 1, or c with logb(a)

- MergeSort T(n) = 2T(n/2) + Θ(n); a=2 b=2 c=1


case 2 ; T(n) = Θ(nlogn)
- Strassen's T(n) =7T(n/2) + Θ(n2) ; a=7 b=2 c=2
case 1, T(n)= Θ(nlog2(7))
- Binary Search T(n)=T(n/2) + Θ(1); a=1 b=2 c=0
case 2, T(n)= Θ(logn)
Master Theorem - why 3 cases

• that sum is geometric progression with base R=a/bc


• it comes down to R being <1 , =1 , >1 . So three cases
Master Theorem - why 3 cases
Master Theorem - why 3 cases
Master Theorem - why 3 cases
Master Theorem

• general case T(n) = aT(n/b) + f(n)


• CASE 1 :
f (n) = O(nlogb a−� ) ⇒ T (n) = Θ(nlogb a )

• CASE 2: logb a k logb a k+1


f (n) = Θ(n log n) ⇒ T (n) = Θ(n log n)

• CASE 3:
logb a+� af (n/b)
f (n) = Ω(n ); < 1 − � ⇒ T (n) = Θ(f (n))
f (n)
Master Theorem Example

• recurrence: T(n)=4T(n/2) 2
+Θ(n logn)
• Master Theorem: a=4; b=2; f(n)= n logn 2

- f(n) / nlogba = f(n)/n2 = logn, so case 2 with k=1

• solution T(n)=Θ(n2log2n)
Master Theorem Example

• T(n)=4T(n/2) + 3
Θ(n )
• Master Theorem: a=4; b=2; f(n)=n 3

- f(n) / nlogba = f(n)/n2 = n, so case 3


- check case 3 condition:
- 4f(n/2)/f(n) = 4(n/2)3/n3 = 1/2 < 1-ε

• solution T(n) = Θ(n3)


NON-Master Theorem Example
• T(n) = 4T(n/2) + n2/logn ; f(n) = n2/logn
• f(n) / nlogba = f(n)/n2 = 1/logn
- case1:
- case2:
- case3:

• no case applies - cant use Master Theorem


• use iteration method for guess, and substitution for a
proof
- see attached pdf

You might also like