We often encounter divide-and-conquer algorithms. When analyzing their time complexity, we may face recurrences of the form:
T ( n ) = a T ( n b ) + f ( n ) T(n) = aT\left(\frac{n}{b}\right) + f(n) T ( n ) = a T ( b n ) + f ( n )
The Master Theorem gives us a powerful tool to solve these recurrences mechanically. But rather than memorizing the formula, let’s build intuition from the ground up.
A Concrete Example
Let’s start with the classic Merge Sort algorithm:
Divide : Split an array of n n n elements into two halves (n 2 \frac{n}{2} 2 n each)
Conquer : Recursively sort each half
Combine : Merge the two sorted halves in O ( n ) O(n) O ( n ) time
The recurrence is:
T ( n ) = 2 T ( n 2 ) + n T(n) = 2T\left(\frac{n}{2}\right) + n T ( n ) = 2 T ( 2 n ) + n
with base case T ( 1 ) = Θ ( 1 ) T(1) = \Theta(1) T ( 1 ) = Θ ( 1 ) .
Build The Recursion Tree By Hand
Let’s expand this recurrence manually to see the pattern:
Level 0: T ( n ) = n + 2 T ( n 2 ) T(n) = n + 2T\left(\frac{n}{2}\right) T ( n ) = n + 2 T ( 2 n )
Level 1: 2 T ( n 2 ) = 2 [ n 2 + 2 T ( n 4 ) ] = n + 4 T ( n 4 ) 2T\left(\frac{n}{2}\right) = 2\left[\frac{n}{2} + 2T\left(\frac{n}{4}\right)\right] = n + 4T\left(\frac{n}{4}\right) 2 T ( 2 n ) = 2 [ 2 n + 2 T ( 4 n ) ] = n + 4 T ( 4 n )
Level 2: 4 T ( n 4 ) = 4 [ n 4 + 2 T ( n 8 ) ] = n + 8 T ( n 8 ) 4T\left(\frac{n}{4}\right) = 4\left[\frac{n}{4} + 2T\left(\frac{n}{8}\right)\right] = n + 8T\left(\frac{n}{8}\right) 4 T ( 4 n ) = 4 [ 4 n + 2 T ( 8 n ) ] = n + 8 T ( 8 n )
T(n) = n T(n/2) = n/2 T(n/4) = n/4 T(n/8) = n/8 T(n/8) = n/8 T(n/4) = n/4 T(n/8) = n/8 T(n/8) = n/8 T(n/2) = n/2 T(n/4) = n/4 T(n/8) = n/8 T(n/8) = n/8 T(n/4) = n/4 T(n/8) = n/8 T(n/8) = n/8
Continuing this pattern:
T ( n ) = n + n + n + ⋯ + 2 k T ( n 2 k ) T(n) = n + n + n + \cdots + 2^k T\left(\frac{n}{2^k}\right) T ( n ) = n + n + n + ⋯ + 2 k T ( 2 k n )
The recursion stops when n 2 k = 1 \frac{n}{2^k} = 1 2 k n = 1 , i.e., k = log 2 n k = \log_2 n k = log 2 n .
At that level, we have 2 log 2 n = n 2^{\log_2 n} = n 2 l o g 2 n = n subproblems, each with cost Θ ( 1 ) \Theta(1) Θ ( 1 ) .
Total cost per level:
Level 0: n n n
Level 1: 2 ⋅ n 2 = n 2 \cdot \frac{n}{2} = n 2 ⋅ 2 n = n
Level 2: 4 ⋅ n 4 = n 4 \cdot \frac{n}{4} = n 4 ⋅ 4 n = n
…
Level i i i : 2 i ⋅ n 2 i = n 2^i \cdot \frac{n}{2^i} = n 2 i ⋅ 2 i n = n
…
Level log 2 n \log_2 n log 2 n : n ⋅ 1 = n n \cdot 1 = n n ⋅ 1 = n (base case)
Total cost:
T ( n ) = n + n + ⋯ + n ⏟ log 2 n + 1 levels = n ( log 2 n + 1 ) = Θ ( n log n ) T(n) = \underbrace{n + n + \cdots + n}_{\log_2 n + 1 \text{ levels}} = n(\log_2 n + 1) = \Theta(n \log n) T ( n ) = l o g 2 n + 1 levels n + n + ⋯ + n = n ( log 2 n + 1 ) = Θ ( n log n )
This is the familiar complexity of merge sort!
Generalizing the Pattern
Now let’s generalize. Consider the recurrence:
T ( n ) = a T ( n b ) + f ( n ) T(n) = aT\left(\frac{n}{b}\right) + f(n) T ( n ) = a T ( b n ) + f ( n )
where:
a ≥ 1 a \geq 1 a ≥ 1 is the number of subproblems
b > 1 b > 1 b > 1 is the factor by which problem size decreases
f ( n ) f(n) f ( n ) is the cost of dividing and combining
Building the Recursion Tree:
Level 0: f ( n ) f(n) f ( n )
Level 1: a ⋅ f ( n b ) a \cdot f\left(\frac{n}{b}\right) a ⋅ f ( b n )
Level 2: a 2 ⋅ f ( n b 2 ) a^2 \cdot f\left(\frac{n}{b^2}\right) a 2 ⋅ f ( b 2 n )
Level i i i : a i ⋅ f ( n b i ) a^i \cdot f\left(\frac{n}{b^i}\right) a i ⋅ f ( b i n )
The tree has depth log b n \log_b n log b n , and at the leaves we have a log b n a^{\log_b n} a l o g b n subproblems of size Θ ( 1 ) \Theta(1) Θ ( 1 ) .
And a log b n = ( b log b a ) log b n = b log b a ⋅ log b n = n log b a a^{\log_b n} = (b^{\log_b a})^{\log_b n} = b^{\log_b a \cdot \log_b n} = n^{\log_b a} a l o g b n = ( b l o g b a ) l o g b n = b l o g b a ⋅ l o g b n = n l o g b a .
The total cost is:
T ( n ) = ∑ i = 0 log b n − 1 a i f ( n b i ) + Θ ( n log b a ) T(n) = \sum_{i=0}^{\log_b n - 1} a^i f\left(\frac{n}{b^i}\right) + \Theta(n^{\log_b a}) T ( n ) = i = 0 ∑ l o g b n − 1 a i f ( b i n ) + Θ ( n l o g b a )
The behavior depends on how f ( n ) f(n) f ( n ) compares to n log b a n^{\log_b a} n l o g b a .
The Master Theorem
Master Theorem Let T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T ( n ) = a T ( n / b ) + f ( n ) where a ≥ 1 a \geq 1 a ≥ 1 , b > 1 b > 1 b > 1 , and f ( n ) f(n) f ( n ) is asymptotically positive. Let c = log b a c = \log_b a c = log b a .
Case 1: If f ( n ) = O ( n c − ϵ ) f(n) = O(n^{c - \epsilon}) f ( n ) = O ( n c − ϵ ) for some ϵ > 0 \epsilon > 0 ϵ > 0 , then T ( n ) = Θ ( n c ) = Θ ( n log b a ) T(n) = \Theta(n^c) = \Theta(n^{\log_b a}) T ( n ) = Θ ( n c ) = Θ ( n l o g b a )
Case 2: If f ( n ) = Θ ( n c ) f(n) = \Theta(n^c) f ( n ) = Θ ( n c ) , then T ( n ) = Θ ( n c log n ) = Θ ( n log b a log n ) T(n) = \Theta(n^c \log n) = \Theta(n^{\log_b a} \log n) T ( n ) = Θ ( n c log n ) = Θ ( n l o g b a log n )
Case 3: If f ( n ) = Ω ( n c + ϵ ) f(n) = \Omega(n^{c + \epsilon}) f ( n ) = Ω ( n c + ϵ ) for some ϵ > 0 \epsilon > 0 ϵ > 0 , and a f ( n / b ) ≤ k f ( n ) af(n/b) \leq kf(n) a f ( n / b ) ≤ k f ( n ) for some k < 1 k < 1 k < 1 and sufficiently large n n n (regularity condition), then T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T ( n ) = Θ ( f ( n ))
Case 1: Leaf-Dominated Case 2: Balanced Case 3: Root-Dominated Work done at leaves dominates total cost. Example: T(n) = 2T(n/2) + 1 Cost: Θ(n) Work is evenly distributed across all levels. Example: T(n) = 2T(n/2) + n Cost: Θ(n log n) Work done at root dominates total cost. Example: T(n) = 2T(n/2) + n² Cost: Θ(n²) f(n) grows f(n) grows faster
Understanding the Cases
Case 1: Leaf Dominated
Example: T ( n ) = 4 T ( n / 2 ) + n T(n) = 4T(n/2) + n T ( n ) = 4 T ( n /2 ) + n
Here a = 4 a = 4 a = 4 , b = 2 b = 2 b = 2 , so c = log 2 4 = 2 c = \log_2 4 = 2 c = log 2 4 = 2 .
We have f ( n ) = n = O ( n 2 − ϵ ) f(n) = n = O(n^{2 - \epsilon}) f ( n ) = n = O ( n 2 − ϵ ) for ϵ = 1 \epsilon = 1 ϵ = 1 .
Verification by expansion:
T ( n ) = n + 4 ⋅ n 2 + 16 ⋅ n 4 + ⋯ + 4 log 2 n ⋅ Θ ( 1 ) = n + 2 n + 4 n + ⋯ + n 2 ⋅ Θ ( 1 ) = n ( 1 + 2 + 4 + ⋯ + 2 log 2 n − 1 ) + Θ ( n 2 ) = n ⋅ Θ ( n ) + Θ ( n 2 ) = Θ ( n 2 ) \begin{aligned}
T(n) &= n + 4 \cdot \frac{n}{2} + 16 \cdot \frac{n}{4} + \cdots + 4^{\log_2 n} \cdot \Theta(1) \\
&= n + 2n + 4n + \cdots + n^2 \cdot \Theta(1) \\
&= n(1 + 2 + 4 + \cdots + 2^{\log_2 n - 1}) + \Theta(n^2) \\
&= n \cdot \Theta(n) + \Theta(n^2) = \Theta(n^2)
\end{aligned} T ( n ) = n + 4 ⋅ 2 n + 16 ⋅ 4 n + ⋯ + 4 l o g 2 n ⋅ Θ ( 1 ) = n + 2 n + 4 n + ⋯ + n 2 ⋅ Θ ( 1 ) = n ( 1 + 2 + 4 + ⋯ + 2 l o g 2 n − 1 ) + Θ ( n 2 ) = n ⋅ Θ ( n ) + Θ ( n 2 ) = Θ ( n 2 )
The leaves contribute Θ ( n 2 ) \Theta(n^2) Θ ( n 2 ) , which dominates the Θ ( n ) \Theta(n) Θ ( n ) work at the root.
Case 2: Balanced
Example: T ( n ) = 4 T ( n / 2 ) + n 2 T(n) = 4T(n/2) + n^2 T ( n ) = 4 T ( n /2 ) + n 2
Here c = 2 c = 2 c = 2 and f ( n ) = n 2 = Θ ( n 2 ) f(n) = n^2 = \Theta(n^2) f ( n ) = n 2 = Θ ( n 2 ) .
Verification by expansion:
Level i i i contributes: 4 i ⋅ ( n 2 i ) 2 = 4 i ⋅ n 2 4 i = n 2 4^i \cdot \left(\frac{n}{2^i}\right)^2 = 4^i \cdot \frac{n^2}{4^i} = n^2 4 i ⋅ ( 2 i n ) 2 = 4 i ⋅ 4 i n 2 = n 2
There are log 2 n \log_2 n log 2 n levels, each contributing n 2 n^2 n 2 .
T ( n ) = n 2 + n 2 + ⋯ + n 2 ⏟ log 2 n levels = Θ ( n 2 log n ) T(n) = \underbrace{n^2 + n^2 + \cdots + n^2}_{\log_2 n \text{ levels}} = \Theta(n^2 \log n) T ( n ) = l o g 2 n levels n 2 + n 2 + ⋯ + n 2 = Θ ( n 2 log n )
Case 3: Root Dominated
Example: T ( n ) = 4 T ( n / 2 ) + n 3 T(n) = 4T(n/2) + n^3 T ( n ) = 4 T ( n /2 ) + n 3
Here c = 2 c = 2 c = 2 and f ( n ) = n 3 = Ω ( n 2 + ϵ ) f(n) = n^3 = \Omega(n^{2 + \epsilon}) f ( n ) = n 3 = Ω ( n 2 + ϵ ) for ϵ = 1 \epsilon = 1 ϵ = 1 .
Check regularity condition:
a f ( n / b ) = 4 ⋅ ( n 2 ) 3 = 4 ⋅ n 3 8 = n 3 2 = 1 2 f ( n ) af(n/b) = 4 \cdot \left(\frac{n}{2}\right)^3 = 4 \cdot \frac{n^3}{8} = \frac{n^3}{2} = \frac{1}{2}f(n) a f ( n / b ) = 4 ⋅ ( 2 n ) 3 = 4 ⋅ 8 n 3 = 2 n 3 = 2 1 f ( n )
So k = 1 2 < 1 k = \frac{1}{2} < 1 k = 2 1 < 1 , satisfying the condition.
Verification:
Level 0: n 3 n^3 n 3
Level 1: 4 ⋅ ( n / 2 ) 3 = n 3 / 2 4 \cdot (n/2)^3 = n^3/2 4 ⋅ ( n /2 ) 3 = n 3 /2
Level 2: 16 ⋅ ( n / 4 ) 3 = n 3 / 4 16 \cdot (n/4)^3 = n^3/4 16 ⋅ ( n /4 ) 3 = n 3 /4
Total:
T ( n ) = n 3 + n 3 2 + n 3 4 + ⋯ = n 3 ∑ i = 0 ∞ 1 2 i = 2 n 3 = Θ ( n 3 ) T(n) = n^3 + \frac{n^3}{2} + \frac{n^3}{4} + \cdots = n^3 \sum_{i=0}^{\infty} \frac{1}{2^i} = 2n^3 = \Theta(n^3) T ( n ) = n 3 + 2 n 3 + 4 n 3 + ⋯ = n 3 i = 0 ∑ ∞ 2 i 1 = 2 n 3 = Θ ( n 3 )
The geometric series converges, so the root cost dominates.
The Akra-Bazzi Method
The Master Theorem has limitations. It doesn’t cover:
Non-constant a a a or b b b
f ( n ) f(n) f ( n ) with logarithmic factors
Subtractions in the recurrence
The Akra-Bazzi Theorem
Akra-Bazzi Theorem: Let T ( x ) T(x) T ( x ) satisfy:
T ( x ) = g ( x ) + ∑ i = 1 k a i T ( b i x + h i ( x ) ) T(x) = g(x) + \sum_{i=1}^{k} a_i T(b_i x + h_i(x)) T ( x ) = g ( x ) + i = 1 ∑ k a i T ( b i x + h i ( x ))
for x ≥ x 0 x \geq x_0 x ≥ x 0 , where:
a i > 0 a_i > 0 a i > 0 and 0 < b i < 1 0 < b_i < 1 0 < b i < 1 are constants
∣ h i ( x ) ∣ = O ( x / log 2 x ) |h_i(x)| = O(x / \log^2 x) ∣ h i ( x ) ∣ = O ( x / log 2 x ) (small perturbation)
g ( x ) g(x) g ( x ) is polynomially bounded
Let p p p be the unique real number satisfying:
∑ i = 1 k a i b i p = 1 \sum_{i=1}^{k} a_i b_i^p = 1 i = 1 ∑ k a i b i p = 1
Then:
T ( x ) = Θ ( x p ( 1 + ∫ 1 x g ( u ) u p + 1 d u ) ) T(x) = \Theta\left(x^p \left(1 + \int_{1}^{x} \frac{g(u)}{u^{p+1}} du\right)\right) T ( x ) = Θ ( x p ( 1 + ∫ 1 x u p + 1 g ( u ) d u ) )
Example: Strassen’s Algorithm
Strassen’s matrix multiplication:
T ( n ) = 7 T ( n / 2 ) + Θ ( n 2 ) T(n) = 7T(n/2) + \Theta(n^2) T ( n ) = 7 T ( n /2 ) + Θ ( n 2 )
By Master Theorem (Case 1): c = log 2 7 ≈ 2.81 c = \log_2 7 \approx 2.81 c = log 2 7 ≈ 2.81 , f ( n ) = O ( n 2.81 − 0.81 ) f(n) = O(n^{2.81 - 0.81}) f ( n ) = O ( n 2.81 − 0.81 ) .
T ( n ) = Θ ( n log 2 7 ) ≈ Θ ( n 2.81 ) T(n) = \Theta(n^{\log_2 7}) \approx \Theta(n^{2.81}) T ( n ) = Θ ( n l o g 2 7 ) ≈ Θ ( n 2.81 )
This beats the naive O ( n 3 ) O(n^3) O ( n 3 ) !
Example: When Master Theorem Doesn’t Apply
Consider:
T ( n ) = 2 T ( n / 2 ) + n log n T(n) = 2T(n/2) + \frac{n}{\log n} T ( n ) = 2 T ( n /2 ) + log n n
Here f ( n ) = n / log n = o ( n ) f(n) = n/\log n = o(n) f ( n ) = n / log n = o ( n ) but not O ( n 1 − ϵ ) O(n^{1-\epsilon}) O ( n 1 − ϵ ) for any ϵ > 0 \epsilon > 0 ϵ > 0 .
Using Akra-Bazzi: a 1 = 2 a_1 = 2 a 1 = 2 , b 1 = 1 / 2 b_1 = 1/2 b 1 = 1/2 , so 2 ⋅ ( 1 / 2 ) p = 1 2 \cdot (1/2)^p = 1 2 ⋅ ( 1/2 ) p = 1 , giving p = 1 p = 1 p = 1 .
∫ 1 n u / log u u 2 d u = ∫ 1 n 1 u log u d u = log log n \int_{1}^{n} \frac{u/\log u}{u^2} du = \int_{1}^{n} \frac{1}{u \log u} du = \log\log n ∫ 1 n u 2 u / log u d u = ∫ 1 n u log u 1 d u = log log n
Therefore:
T ( n ) = Θ ( n ( 1 + log log n ) ) = Θ ( n log log n ) T(n) = \Theta\left(n \left(1 + \log\log n\right)\right) = \Theta(n \log\log n) T ( n ) = Θ ( n ( 1 + log log n ) ) = Θ ( n log log n )
Variations and Extensions
Ceiling and Floor Functions
The Master Theorem applies to:
T ( n ) = a T ( ⌈ n / b ⌉ ) + f ( n ) T(n) = aT(\lceil n/b \rceil) + f(n) T ( n ) = a T (⌈ n / b ⌉) + f ( n )
T ( n ) = a T ( ⌊ n / b ⌋ ) + f ( n ) T(n) = aT(\lfloor n/b \rfloor) + f(n) T ( n ) = a T (⌊ n / b ⌋) + f ( n )
The asymptotic bounds remain unchanged because the ceiling/floor introduces only O ( 1 ) O(1) O ( 1 ) perturbations.
The Substitution Method (Verification)
Always verify your Master Theorem result using substitution.
Example: Verify T ( n ) = 2 T ( n / 2 ) + n = Θ ( n log n ) T(n) = 2T(n/2) + n = \Theta(n \log n) T ( n ) = 2 T ( n /2 ) + n = Θ ( n log n ) .
Upper bound guess: T ( n ) ≤ c n log n T(n) \leq cn \log n T ( n ) ≤ c n log n
T ( n ) = 2 T ( n / 2 ) + n ≤ 2 ⋅ c ⋅ n 2 ⋅ log n 2 + n = c n ( log n − 1 ) + n = c n log n − c n + n ≤ c n log n for c ≥ 1 \begin{aligned}
T(n) &= 2T(n/2) + n \leq 2 \cdot c \cdot \frac{n}{2} \cdot \log\frac{n}{2} + n \\
&= cn(\log n - 1) + n = cn \log n - cn + n \\
&\leq cn \log n \text{ for } c \geq 1
\end{aligned} T ( n ) = 2 T ( n /2 ) + n ≤ 2 ⋅ c ⋅ 2 n ⋅ log 2 n + n = c n ( log n − 1 ) + n = c n log n − c n + n ≤ c n log n for c ≥ 1
Lower bound: Similar argument with T ( n ) ≥ c n log n T(n) \geq cn \log n T ( n ) ≥ c n log n .
The Iteration Method
For complex recurrences, unrolling is often illuminating:
T ( n ) = T ( n / 3 ) + T ( 2 n / 3 ) + n T(n) = T(n/3) + T(2n/3) + n T ( n ) = T ( n /3 ) + T ( 2 n /3 ) + n
This splits unevenly, but the recursion tree has depth log 3 / 2 n \log_{3/2} n log 3/2 n , and each level sums to n n n .
Level 0 Level 1 Level 2 n n/3 2n/3 n/9 2n/9 2n/9 4n/9
At each level, the sum is n n n . The longest path is n → 2 n / 3 → 4 n / 9 → ⋯ n \to 2n/3 \to 4n/9 \to \cdots n → 2 n /3 → 4 n /9 → ⋯ with depth log 3 / 2 n \log_{3/2} n log 3/2 n .
T ( n ) = Θ ( n log n ) T(n) = \Theta(n \log n) T ( n ) = Θ ( n log n )
Common Pitfalls
The Gap Between Cases
Does not apply: T ( n ) = 2 T ( n / 2 ) + n log n T(n) = 2T(n/2) + n \log n T ( n ) = 2 T ( n /2 ) + n log n
Here f ( n ) = n log n f(n) = n \log n f ( n ) = n log n is not polynomially larger or smaller than n 1 n^1 n 1 .
Solution: Use the recursion tree or Akra-Bazzi:
T ( n ) = Θ ( n log 2 n ) T(n) = \Theta(n \log^2 n) T ( n ) = Θ ( n log 2 n )
Forgetting the Regularity Condition
Case 3 requires a f ( n / b ) ≤ k f ( n ) af(n/b) \leq kf(n) a f ( n / b ) ≤ k f ( n ) for k < 1 k < 1 k < 1 .
Example where Case 3 fails:
T ( n ) = 2 T ( n / 2 ) + n ( 2 + cos n ) T(n) = 2T(n/2) + n(2 + \cos n) T ( n ) = 2 T ( n /2 ) + n ( 2 + cos n )
Here f ( n ) = Ω ( n 1 + ϵ ) f(n) = \Omega(n^{1+\epsilon}) f ( n ) = Ω ( n 1 + ϵ ) sometimes, but oscillates. The regularity condition fails because cos n \cos n cos n doesn’t allow a uniform k < 1 k < 1 k < 1 .
Non-constant a a a or b b b
Does not apply: T ( n ) = T ( n / 2 ) + T ( n / 4 ) + n T(n) = T(n/2) + T(n/4) + n T ( n ) = T ( n /2 ) + T ( n /4 ) + n
The Master Theorem requires constant a a a and b b b . Use Akra-Bazzi instead.
Further Reading