Memoization Top Down DP in DSA C - Time & Space Complexity
We analyze how memoization in top-down dynamic programming reduces repeated work.
We want to know how the number of operations changes as input size grows.
Analyze the time complexity of the following code snippet.
int fib(int n, int memo[]) {
if (n <= 1) return n;
if (memo[n] != -1) return memo[n];
memo[n] = fib(n-1, memo) + fib(n-2, memo);
return memo[n];
}
This code calculates the nth Fibonacci number using recursion with memoization to store results.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls to fib with memo checks.
- How many times: Each unique fib(n) is computed once; repeated calls return stored results instantly.
Each number from 0 to n is computed once, so operations grow roughly in a straight line with n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 computations |
| 100 | About 100 computations |
| 1000 | About 1000 computations |
Pattern observation: Doubling n roughly doubles the work, showing linear growth.
Time Complexity: O(n)
This means the time taken grows in direct proportion to the input size n.
[X] Wrong: "Memoization still does all recursive calls like plain recursion."
[OK] Correct: Memoization stores results, so each unique call runs once, avoiding repeated work.
Understanding memoization's time savings shows you can optimize slow recursive solutions effectively.
"What if we removed memoization? How would the time complexity change?"
Practice
Solution
Step 1: Understand memoization concept
Memoization saves answers of smaller problems so they don't get solved again.Step 2: Identify its role in top-down DP
It stores subproblem results during recursion to speed up the process.Final Answer:
To store results of subproblems to avoid repeated calculations -> Option CQuick Check:
Memoization = Store subproblem results [OK]
- Confusing memoization with sorting
- Thinking memoization converts recursion to iteration
- Believing memoization increases recursive calls
Solution
Step 1: Recall C array declaration syntax
In C, arrays are declared with fixed size and optional initialization like int memo[100] = {0};Step 2: Check each option
int memo[100] = {0}; uses correct C syntax. Options A and C use Java/C++ style. int memo(100); is invalid in C.Final Answer:
int memo[100] = {0}; -> Option BQuick Check:
C array declaration = int memo[100] = {0}; [OK]
- Using Java or C++ style array declarations in C
- Forgetting to initialize memo array to zero
- Using parentheses instead of brackets for arrays
int memo[10] = {0};
int fib(int n) {
if (n <= 1) return n;
if (memo[n] != 0) return memo[n];
memo[n] = fib(n-1) + fib(n-2);
return memo[n];
}
int main() {
printf("%d", fib(5));
return 0;
}Solution
Step 1: Trace fib(5) calls and memo usage
fib(5) calls fib(4) + fib(3), and so on. Memo stores results to avoid repeats.Step 2: Calculate fib(5)
fib(0)=0, fib(1)=1, fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5.Final Answer:
5 -> Option DQuick Check:
fib(5) = 5 [OK]
- Confusing fib(5) with fib(6)
- Ignoring memoization effect
- Assuming memo array starts with all ones
int memo[10];
int fib(int n) {
if (n <= 1) return n;
if (memo[n] != -1) return memo[n];
memo[n] = fib(n-1) + fib(n-2);
return memo[n];
}
int main() {
printf("%d", fib(5));
return 0;
}Solution
Step 1: Check memo array initialization
Memo is checked for -1 but never initialized, so contains garbage values.Step 2: Understand impact on memoization
Without initialization, memo[n] != -1 may be true incorrectly, causing wrong returns.Final Answer:
memo array is not initialized to -1 -> Option AQuick Check:
Initialize memo to -1 before use [OK]
- Forgetting to initialize memo array
- Changing base case incorrectly
- Assuming default zero initialization in C
countWays(4)? Assume memo array is initialized with -1.int memo[100];
int countWays(int n) {
if (n == 0) return 1;
if (n < 0) return 0;
if (memo[n] != -1) return memo[n];
memo[n] = countWays(n-1) + countWays(n-2);
return memo[n];
}
int main() {
for(int i=0; i<100; i++) memo[i] = -1;
printf("%d", countWays(4));
return 0;
}Solution
Step 1: Understand problem and base cases
Ways to climb 0 steps = 1, negative steps = 0, ways(n) = ways(n-1)+ways(n-2).Step 2: Calculate countWays(4)
countWays(1)=1, countWays(2)=2, countWays(3)=3, countWays(4)=5.Final Answer:
5 -> Option AQuick Check:
Ways to climb 4 steps = 5 [OK]
- Confusing base cases for counting ways
- Not initializing memo array
- Mixing up countWays with Fibonacci values
Ready to prove it?
Pass the test and this pattern moves unknown
