Prefix Sum Array in DSA C - Time & Space Complexity
We want to understand how fast we can build and use a prefix sum array.
How does the time needed grow as the input array gets bigger?
Analyze the time complexity of the following code snippet.
void buildPrefixSum(int arr[], int prefix[], int n) {
prefix[0] = arr[0];
for (int i = 1; i < n; i++) {
prefix[i] = prefix[i - 1] + arr[i];
}
}
int rangeSum(int prefix[], int l, int r) {
if (l == 0) return prefix[r];
return prefix[r] - prefix[l - 1];
}
This code builds a prefix sum array from an input array and then uses it to find the sum of elements between two indexes quickly.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that runs from 1 to n-1 to build the prefix sums.
- How many times: It runs exactly n-1 times, once for each element after the first.
As the input array size grows, the number of steps to build the prefix sum grows roughly the same amount.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 9 additions |
| 100 | 99 additions |
| 1000 | 999 additions |
Pattern observation: The work grows linearly with input size; doubling the input roughly doubles the work.
Time Complexity: O(n)
This means the time to build the prefix sum array grows in direct proportion to the size of the input array.
[X] Wrong: "Calculating the sum of any range using the prefix sum array takes O(n) time because we still add elements."
[OK] Correct: Using the prefix sum array, range sums are found with just two lookups and one subtraction, which is O(1) time, not O(n).
Understanding prefix sums helps you quickly answer range sum queries, a common pattern in coding problems. Mastering this shows you can optimize repeated calculations efficiently.
"What if we needed to update elements in the array frequently? How would that affect the time complexity of using a prefix sum array?"
Practice
prefix sum array in data structures?Solution
Step 1: Understand prefix sum array definition
A prefix sum array stores sums of elements from the start up to each index.Step 2: Identify its use
This allows quick calculation of sums for any subarray by subtracting prefix sums.Final Answer:
To quickly find the sum of elements in any subarray -> Option AQuick Check:
Prefix sum = fast subarray sums [OK]
- Confusing prefix sum with sorting
- Thinking it stores products
- Assuming it reverses arrays
prefix for an integer array arr of size n in C?Solution
Step 1: Initialize first prefix element
Set prefix[0] to arr[0] to start sums correctly.Step 2: Loop from 1 to n-1 adding previous prefix and current arr
Use prefix[i] = prefix[i-1] + arr[i] for correct cumulative sums.Final Answer:
prefix[0] = arr[0]; for(int i=1; i -> Option BQuick Check:
Start at arr[0], add cumulatively [OK]
- Starting prefix at 0 and indexing arr out of bounds
- Copying arr directly without summing
- Using wrong starting index for arr
arr = {2, 4, 6, 8}, what is the prefix sum array after running the code:int prefix[4];
prefix[0] = arr[0];
for(int i = 1; i < 4; i++) {
prefix[i] = prefix[i-1] + arr[i];
}Solution
Step 1: Calculate prefix[0]
prefix[0] = arr[0] = 2Step 2: Calculate prefix sums for i=1 to 3
prefix[1] = 2 + 4 = 6, prefix[2] = 6 + 6 = 12, prefix[3] = 12 + 8 = 20Final Answer:
[2, 6, 12, 20] -> Option CQuick Check:
Sum accumulates: 2, 6, 12, 20 [OK]
- Confusing prefix sums with original array
- Starting sums from zero incorrectly
- Adding wrong elements in loop
arr of size n:int prefix[n];
prefix[0] = 0;
for(int i = 1; i < n; i++) {
prefix[i] = prefix[i-1] + arr[i];
}Solution
Step 1: Check prefix[0] initialization
prefix[0] must hold arr[0] to start sums correctly, not zero.Step 2: Analyze loop correctness
Loop starting at 1 is correct if prefix[0] is set properly.Final Answer:
prefix[0] should be initialized to arr[0], not 0 -> Option AQuick Check:
prefix[0] = arr[0] starts sums right [OK]
- Setting prefix[0] to zero causes wrong sums
- Starting loop at wrong index
- Assuming prefix array size must be n+1
arr = {3, 1, 4, 1, 5, 9, 2}. Using a prefix sum array, how would you efficiently find the sum of elements from index 2 to 5 (inclusive)?Solution
Step 1: Build prefix sum array
prefix[i] = sum of arr[0] to arr[i]. For example, prefix[5] = sum of arr[0..5].Step 2: Calculate sum from index 2 to 5
Sum = prefix[5] - prefix[1], because prefix[1] = sum of arr[0..1].Final Answer:
Calculate prefix[5] - prefix[1] after building prefix sums -> Option DQuick Check:
Sum(i..j) = prefix[j] - prefix[i-1] [OK]
- Adding prefix sums instead of subtracting
- Using wrong indices for prefix subtraction
- Summing elements directly ignoring prefix sums
Ready to prove it?
Pass the test and this pattern moves unknown
