+ n

CSC 344 – Algorithms and
Complexity
Lecture #10 – Recurrences
(Extended)
Recurrences and Running Time
• An equation or inequality that describes a function in terms of
its value on smaller inputs.
T(n) = T(n-1) + n
• Recurrences arise when an algorithm contains recursive calls
to itself
• What is the actual running time of the algorithm?
• Need to solve the recurrence
– Find an explicit formula of the expression
– Bound the recurrence by an expression that involves n
Examples of Recurrence
Θ(n2)
• T(n) = T(n-1) + n
– Recursive algorithm that loops through the input to
eliminate one item
• T(n) = T(n/2) + c
Θ(log n)
– Recursive algorithm that halves the input in one step
• T(n) = T(n/2) + n
Θ(n)
– Recursive algorithm that halves the input but must examine
every item in the input
• T(n) = 2T(n/2) + 1
Θ(n)
– Recursive algorithm that splits the input into 2 halves and
does a constant amount of other work
Recurrent Algorithms: Binary Search
• For an ordered array A, finds if x is in the array
A[low…high]
• The algorithm: BinarySearch (A, lo, hi, x)
if (low > high)
1
return FALSE
2
mid ← (lo+hi)/2
if x = A[mid]
return TRUE
low
if ( x < A[mid] )
BINARY-SEARCH (A, lo, mid-1, x)
if ( x > A[mid] )
BINARY-SEARCH (A, mid+1, hi, x)
2
3
4
3
5
7
5
6
7
8
9 10 11 12
mid
high
Tracing Binary Search
• A[8] = {1, 2, 3, 4, 5, 7, 9, 11}
– low = 1
1
2
3
4
5
6
1
2
3
4
5
7
5
6
5
7
1
2
x=7
high = 8
3
4
7
8
9 11
mid = 4, low = 5, high = 8
8
7
9 11
mid = 6, A[mid] = x
Found!
Tracing Binary Search Again
• A[8] = {1, 2, 3, 4, 5, 7, 9, 11}
•
x=6
low = 1 high = 8
1
2
3
4
5
6
1
2
3
4
5
7
7
9 11
mid = 4, low = 5, high = 8
high
low
1
8
2
3
4
5
7
9 11
high
low
1
2
3
4
5
7
9 11
1
2
3
4
5
7
9 11
high
mid = 6, A[6] = 7, low = 5, high = 5
low
mid = 5, A[5] = 5, low = 6, high = 5
NOT FOUND!
Analysis of Binary Search
Algorithm Binary Search (A, low, high, x)
if (low > high)
return FALSE
mid ← (low+high)/2
if x = A[mid]
return TRUE
if ( x < A[mid] )
Binary Search (A, low, mid-1, x)
if ( x > A[mid] )
Binary Search (A, mid+1, high, x)
•
constant time: c1
constant time: c2
constant time: c3
same problem of size n/2
same problem of size n/2
T(n) = c +T(n/2)
–
T(n) – running time for an array of size n
Methods for Solving Recurrences
• Iteration method
• Substitution method
• Recursion tree method
• Master method
The Iteration Method
• Convert the recurrence into a summation and
try to bound it using known series
– Iterate the recurrence until the initial condition is
reached.
– Use back-substitution to express the recurrence in
terms of n and the initial (boundary) condition
The Iteration Method
T(n) = c + T(n/2)
T(n) = c + T(n/2)
= c + c + T(n/4)
= c + c + c + T(n/8)
Assume n = 2k
T(n) = c + c + … + c + T(1)
k times
= c log n + T(1)
= Θ(log n)
Iteration Method – Example
Assume: n = 2k
T(n) = n + 2T(n/2)
T(n/2) = n/2 + 2T(n/4)
T(n) = n + 2T(n/2)
= n + 2(n/2 + 2T(n/4))
= n + n + 4T(n/4)
= n + n + 4(n/4 + 2T(n/8))
= n + n + n + 8T(n/8)
… = i n + 2iT(n/2i)
= k n + 2kT(1)
= n log n + nT(1) = Θ(n log n)
The Substitution Method
1. Guess a solution
2. Use induction to prove that the solution
works
Substitution Method
•
Guess a solution
–
T(n) = O(g(n))
– Induction goal: apply the definition of the asymptotic
notation
• T(n) ≤ d g(n), for some d > 0 and n ≥ n0
– Induction hypothesis: T(k) ≤ d g(k) for all k < n
•
Prove the induction goal
– Use the induction hypothesis to find some values of the
constants d and n0 for which the induction goal holds
Example: Binary Search
T(n) = c + T(n/2)
•
Guess: T(n) = O(log n)
– Induction goal: T(n) ≤ d log n, for some d and
– Induction hypothesis: T(n/2) ≤ d log (n/2)
•
Proof of induction goal:
T(n) = T(n/2) + c ≤ d lg(n/2) + c
= d log n – d + c ≤ d log n
if: – d + c ≤ 0, d ≥ c
• Base case?
n ≥ n0
Example 2
T(n) = T(n-1) + n
•
•
Guess: T(n) = O(n2)
–
Induction goal: T(n) ≤ c n2, for some c and n ≥ n0
–
Induction hypothesis: T(n-1) ≤ c(n-1)2 for all k < n
Proof of induction goal:
T(n) = T(n-1) + n ≤ c (n-1)2 + n
= c n2 – (2 c n – c - n) ≤ c n2
if: 2 c n – c – n ≥ 0 ⇔ c ≥ n/(2 n - 1) ⇔ c ≥ 1/(2 – 1/n)
–
For n ≥ 1 ⇒ 2 – 1/n ≥ 1 ⇒ any c ≥ 1 will work
Example 3
T(n) = 2T(n/2) + n
•
Guess: T(n) = O(n log n)
– Induction goal: T(n) ≤ c n log n, for some c and n ≥ n0
– Induction hypothesis: T(n/2) ≤ c n/2 log(n/2)
•
Proof of induction goal:
•
T(n) = 2T(n/2) + n ≤ 2c (n/2) log(n/2) + n
= c n log n – c n + n ≤ c n log n
if: - c n + n ≤ 0 ⇒ c ≥ 1
Base case?
Changing variables
T(n) = 2T( n) + log n
• Rename: m = log n ⇒ n = 2m
T (2m) = 2T(2m/2) + m
• Rename: S(m) = T(2m)
S(m) = 2S(m/2) + m ⇒ S(m) = O(m log m)
(demonstrated before)
T(n) = T(2m) = S(m) = O(m log m)=O(log n · log(log n))
Idea: transform the recurrence to one that you have seen
before
The Recursion Tree Method
• Convert the recurrence into a tree:
– Each node represents the cost incurred at various
levels of recursion
– Sum up the costs of all levels
• Used to “guess” a solution for the recurrence
Example 1
W(n) = 2W(n/2) + n2
Example 1
W(n) = 2W(n/2) + n2
•
•
•
•
Subproblem size at level i is: n/2i
Subproblem size hits 1 when 1 = n/2i ⇒ i = log n
Cost of the problem at level i = (n/2i)2
No. of nodes at level i = 2i
Total cost:
i
i
lg n −1 2
W (n) =
n
∑2
i =0
⇒ W(n) =
O(n2)
i
lg n −1
∞
1
1
1
+ 2lg n W (1) = n 2 ∑   + n ≤ n 2 ∑   + O(n) =n 2
+ O ( n ) = 2n 2
1− 1
i =0  2 
i =0  2 
2
Example 2
E.g.: T(n) = 3T(n/4) + c n2
Example 2
•
•
•
•
Subproblem size at level i is: n/4i
Subproblem size hits 1 when 1 = n/4i ⇒ i = log4n
Cost of a node at level i = c (n/4i)2
Number of nodes at level i = 3i ⇒ last level has 3log4n = nlog43
nodes
•
Total cost:
log 4 n −1
T ( n) =
∑
i=0
•
i
i
∞
1
3 2
3 2
log 3
log 3
cn 2 + Θ n log 4 3 = O (n 2 )
  cn + Θ n 4 ≤ ∑   cn + Θ n 4 =
3
16
16
 

i =0 
1−
16
(
⇒ T(n) = O(n2)
)
(
)
(
)
Example 2 - Substitution
T(n) = 3T(n/4) + c n2
•
Guess: T(n) = O(n2)
– Induction goal: T(n) ≤ d n2, for some d and n ≥ n0
– Induction hypothesis: T(n/4) ≤ d (n/4)2
•
Proof of induction goal:
T(n) = 3T(n/4) + c n2
≤ 3d (n/4)2 + c n2
= (3/16) d n2 + c n2
≤ d n2
•
if: d ≥ (16/13)c
Therefore: T(n) =
O(n2)
Example 3 (simpler proof)
W(n) = W(n/3) + W(2n/3) + n
•
The longest path from the root to a
leaf is:
n → (2/3)n → (2/3)2 n → … → 1
•
Subproblem size hits 1 when
1
= (2/3)in ⇔ i=log3/2n
•
Cost of the problem at level i = n
•
Total cost:
W (n) < n + n + ... = n(log 3/ 2 n) = n
⇒ W(n) = O(n log n)
lg n
= O (n lg n)
3
lg
2
Example 3
W(n) = W(n/3) + W(2n/3) + n
•
The longest path from the root to a
leaf is:
n → (2/3)n → (2/3)2 n → … → 1
•
Subproblem size hits 1 when
=
(2/3)in
1
⇔ i=log3/2n
•
Cost of the problem at level i = n
•
Total cost:
(log 3 / 2 n ) −1
W ( n) < n + n + ... =
∑
n + 2(log3 / 2 n ) W (1) <
i =0
log 3 / 2 n
<n
∑
1 + nlog3 / 2 2 = n log 3/ 2 n + O( n) = n
i =0
lg n
1
+ O( n) =
n lg n + O( n)
lg 3 / 2
lg 3 / 2
⇒ W(n) = O(n log n)
Example 3 - Substitution
W(n) = W(n/3) + W(2n/3) + O(n)
• Guess: W(n) = O(n log n)
– Induction goal: W(n) ≤ d n log n, for some d and n
≥ n0
– Induction hypothesis: W(k) ≤ d k log k
< n (n/3, 2n/3)
• Proof of induction goal:
Try it out as an exercise!!
• T(n) = O(n log n)
for any k
Master’s Method
• "Cookbook” for solving recurrences of the
form:
n
T (n) = aT   + f (n)
b
where a ≥ 1, b > 1, and f(n) > 0
• Idea - compare f(n) with nlogba
• f(n) is asymptotically smaller or larger than
nlogba by a polynomial factor nε
• f(n) is asymptotically equal with nlogba
Master’s Method
• Cookbook” for solving recurrences of the
form:
n
T (n) = aT   + f (n)
b
where, a ≥ 1, b > 1, and f(n) > 0
Case 1: if f(n) = O(nlogba -ε) for some ε > 0, then:
T(n) = Θ(nlogba)
Master’s Method
Case 2: if f(n) = Θ(nlogba),
then: T(n) = Θ(nlogba log n)
Master’s Method
Case 3: if f(n) = Ω(nlogba +ε) for some ε > 0, and
if a f(n/b) ≤ c f(n) for some c < 1 and all
sufficiently large n, then:
regularity condition
T(n) = Θ(f(n))
n
T (n) = aT  
b
 n
a 2T  2 
b 
n
a 3T  3 
b 
Why nlogba?
n
T (n) = aT   + f ( n)
b
n
T (n) = a iT  i  ∀i
b 
• Assume n = bk ⇒ k = logbn
• At the end of iteration i = k:
 bi 
T ( n) = a log b nT  i  = a log b nT (1) = Θ a logb n = Θ n logb a
b 
(
) (
Why nlogba?
• Case 1:
• If f(n) is dominated by nlogba:
• T(n) = Θ(nlogbn)
• Case 3:
• If f(n) dominates nlogba:
• T(n) = Θ(f(n))
• Case 2:
• If f(n) = Θ(nlogba):
• T(n) = Θ(nlogba log n)
)
n
T (n) = aT   + f ( n)
b