Divide and Conquer Strategy and Recurrence Relations in DSA C - Time & Space Complexity
We want to understand how dividing a problem into smaller parts affects the time it takes to solve it.
How does breaking a task into pieces change the total work needed?
Analyze the time complexity of the following code snippet.
void divideAndConquer(int n) {
if (n <= 1) return;
divideAndConquer(n / 2);
divideAndConquer(n / 2);
// constant time work
}
This code splits the problem into two halves recursively and does a small fixed amount of work each time.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two recursive calls each on half the input size.
- How many times: The recursion continues until the input size reduces to 1.
Each call splits into two smaller calls, doubling the number of calls as input grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 19 calls |
| 100 | About 199 calls |
| 1000 | About 1999 calls |
Pattern observation: The number of calls roughly doubles each time the input size doubles, growing quickly but not as fast as squaring.
Time Complexity: O(n)
This means the total work grows roughly in direct proportion to the input size.
[X] Wrong: "Because there are two recursive calls, the time must be exponential like O(2^n)."
[OK] Correct: Each call works on half the input, so the total number of calls grows linearly, not exponentially.
Understanding how dividing a problem affects time helps you explain and design efficient algorithms confidently.
"What if the code made three recursive calls instead of two, each on one-third of the input? How would the time complexity change?"
Practice
Divide and Conquer strategy in algorithms?Solution
Step 1: Understand Divide and Conquer approach
It splits a big problem into smaller parts that are easier to solve.Step 2: Combine solutions of subproblems
After solving smaller parts, their results are combined to get the final answer.Final Answer:
Break the problem into smaller subproblems, solve them independently, then combine results -> Option CQuick Check:
Divide and Conquer = Break, Solve, Combine [OK]
- Confusing divide and conquer with brute force
- Thinking it uses only loops without recursion
- Mixing it up with dynamic programming
n?Solution
Step 1: Recall Merge Sort process
Merge Sort splits array into two halves, sorts each half recursively, then merges in O(n) time.Step 2: Write recurrence relation
It calls itself twice on size n/2 plus linear merge step, so T(n) = 2T(n/2) + O(n).Final Answer:
T(n) = 2T(n/2) + O(n) -> Option BQuick Check:
Merge Sort recurrence = 2 halves + merge O(n) [OK]
- Using T(n-1) instead of T(n/2)
- Ignoring the merge step cost
- Confusing with quicksort recurrence
int func(int n) {
if (n <= 1) return 1;
return func(n/2) + func(n/2) + n;
}What is the time complexity T(n) of this function?
Solution
Step 1: Identify recurrence relation
The function calls itself twice on n/2 plus does O(n) work, so T(n) = 2T(n/2) + n.Step 2: Solve recurrence using Master Theorem
For T(n) = 2T(n/2) + n, the solution is O(n log n).Final Answer:
O(n log n) -> Option DQuick Check:
2 calls on half + linear work = n log n [OK]
- Thinking it is O(n) by ignoring recursive calls
- Confusing with O(log n) for single call
- Mistaking it for quadratic O(n^2)
T(n) = 3T(n/3) + n^2
There is a mistake in the code implementing this recurrence. Which fix will correct the recurrence to match the intended divide and conquer approach?
Solution
Step 1: Understand the recurrence meaning
3T(n/3) means dividing problem into 3 equal parts recursively, plus n^2 extra work.Step 2: Fix code to match recurrence
Ensure code calls itself 3 times on n/3 size and does n^2 work outside recursion.Final Answer:
Change the recursive calls to 3T(n/3) and keep n^2 as extra work -> Option AQuick Check:
3 recursive calls on n/3 + n^2 work = 3T(n/3)+n^2 [OK]
- Changing extra work without fixing recursive calls
- Using wrong subproblem size like n-1
- Reducing calls to 2 instead of 3
n that you divide into 4 subproblems each of size n/2. The extra work done outside the recursive calls is O(n^2). What is the time complexity T(n) of this divide and conquer algorithm?Solution
Step 1: Write the recurrence relation
Since there are 4 subproblems each size n/2 and extra work n^2, T(n) = 4T(n/2) + n^2.Step 2: Apply Master Theorem
Here, a=4, b=2, f(n)=n^2. Calculate log_b(a) = log_2(4) = 2. Since f(n) = Theta(n^2), it matches n^{log_b(a)}.Step 3: Determine complexity
By Master Theorem case 2, T(n) = Theta(n^2 log n).Final Answer:
O(n^2 log n) -> Option AQuick Check:
4 calls on half + n^2 work = n^2 log n [OK]
- Ignoring the log factor in complexity
- Confusing number of subproblems with size
- Mistaking it for cubic or linear complexity
Ready to prove it?
Pass the test and this pattern moves unknown
