Prefix Sum
The idea of prefix sum is to construct an array that for each index prefix_sum[index]
represent the total cumulative sum of all element between the first element to the element for the given index. This is an useful tool when there are a lot of operation of getting the sum of a sub-array of the inputting array.
numbers
----- ----- ----- ----- ----- ----- -----
| 4 | 6 | 10 | 40 | 5 | 8 | 30 |
----- ----- ----- ----- ----- ----- -----
0 1 2 3 4 5 6
prefix-sum (inclusive)
----- ----- ----- ----- ----- ----- -----
| 4 | 10 | 20 | 60 | 65 | 73 | 103 |
----- ----- ----- ----- ----- ----- -----
0 1 2 3 4 5 6
prefix-sum (exclusive)
----- ----- ----- ----- ----- ----- ----- -----
| 0 | 4 | 10 | 20 | 60 | 65 | 73 | 103 |
----- ----- ----- ----- ----- ----- ----- -----
0 1 2 3 4 5 6 7
Variables
numbers
the input arrays that contains numbers with length ofn
prefix_sum
the prefix sum array
Two types of prefix sum
-
inclusive prefix sum
prefix_sum[i] = prefix_sum[i - 1] + number[i]
- The value
prefix_sum[i]
includesnumber[i]
and all numbers comes beforenumber[i]
-
exclusive prefix sum
prefix_sum[i] = prefix_sum[i - 1] + number[i - 1]
- The value
prefix_sum[i]
does notnumber[i]
but includes all numbers comes beforenumber[i]
For the sake of simplicity and to avoid accessing numbers with native index, I always use the exclusive prefix sum
How to build the prefix sum array:
#![allow(unused)] fn main() { let numbers = vec![4, 6, 10, 40, 5, 8, 30]; let mut prefix_sum = vec![0; numbers.len() + 1]; for i in 0..numbers.len() { prefix_sum[i + 1] = prefix_sum[i] + numbers[i]; } println!{"numbers: {:?}", numbers}; println!{"prefix_sum: {:?}", prefix_sum}; }
How to access the sum of all element with index [i, j)
:
#![allow(unused)] fn main() { let prefix_sum = vec![0, 4, 10, 20, 60, 65, 73, 103]; let (i, j) = (2, 5); let sum = prefix_sum[j] - prefix_sum[i]; println!("sum of sub array [10, 40, 5]: {:?}", sum); }