Suffix Sum Array
Last Updated :
09 Nov, 2023
Suffix Sum ArrayGiven an array arr[] of size N, the task is to compute and return its suffix sum array.
Suffix Sum is a precomputation technique in which the sum of all the elements of the original array from an index i till the end of the array is computed.
Therefore, this suffix sum array will be created using the relation:
Examples:
Input: arr[] = { 15, 10, 25, 5, 10, 20 } , N = 6
Output: suffixSum[] = { 85, 70, 60, 35, 30, 20}
Explanation: While traversing the array from back, keep adding element from the back with element at current index.
suffixSum[5] = 20,
suffixSum[4] =suffixSum[5] + arr[4] = 20+10 = 30 ,
suffixSum[3] = suffixSum[4] + arr[3] = 30+5 = 35 and so on.
Input: arr[] = {10, 14, 16, 20}, n = 6
Output: suffixSum[] = {60, 50, 36, 20}
Explanation: suffixSum[3] = 20,
suffixSum[2] =suffixSum[3] + arr[2] = 20+16 = 36 ,
suffixSum[1] = suffixSum[2] + arr[1] = 36+14 = 40 and so on.
Naive Approach:
The naive approach to solve the problem is to traverse each element of the array and for each element calculate the sum of remaining elements to its right including itself using another loop.
Algorithm:
- Initialize an empty result vector suffixSum of size N with all elements as 0.
- Traverse the array arr[] from left to right using a for loop.
- For each i-th element in arr[], initialize a variable sum to 0.
- Traverse the subarray arr[i:N] from i-th index to N-th index using another for loop.
- For each j-th element in the subarray arr[i:N], add the value of arr[j] to the variable sum.
- After the inner loop is completed, set the i-th index of suffixSum vector as the value of sum.
- Continue the outer loop until all elements of arr[] have been traversed.
- The suffixSum vector now contains the suffix sum array for the input array arr[].
- Return the suffixSum vector.
Below is the implementation of the approach:
C++
#include<bits/stdc++.h>
using namespace std;
int main() {
vector< int > arr = { 10, 14, 16, 20 };
int n = arr.size();
vector< int > suffixSum(n, 0);
for ( int i=0; i<n; i++) {
for ( int j=i; j<n; j++) {
suffixSum[i] += arr[j];
}
}
cout << "Suffix sum array: " ;
for ( int i=0; i<suffixSum.size(); i++) {
cout << suffixSum[i] << " " ;
}
return 0;
}
|
Java
import java.util.ArrayList;
import java.util.List;
public class SuffixSumArray {
public static void main(String[] args) {
List<Integer> arr = List.of( 10 , 14 , 16 , 20 );
int n = arr.size();
List<Integer> suffixSum = new ArrayList<>(n);
for ( int i = 0 ; i < n; i++) {
suffixSum.add( 0 );
}
for ( int i = 0 ; i < n; i++) {
for ( int j = i; j < n; j++) {
suffixSum.set(i, suffixSum.get(i) + arr.get(j));
}
}
System.out.print( "Suffix sum array: " );
for ( int i = 0 ; i < suffixSum.size(); i++) {
System.out.print(suffixSum.get(i) + " " );
}
}
}
|
Python3
arr = [ 10 , 14 , 16 , 20 ]
n = len (arr)
suffix_sum = [ 0 ] * n
for i in range (n):
for j in range (i, n):
suffix_sum[i] + = arr[j]
print ( "Suffix sum array:" , suffix_sum)
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List< int > arr = new List< int > { 10, 14, 16, 20 };
int n = arr.Count;
List< int > suffixSum = new List< int >( new int [n]);
for ( int i = 0; i < n; i++)
{
for ( int j = i; j < n; j++)
{
suffixSum[i] += arr[j];
}
}
Console.Write( "Suffix sum array: " );
foreach ( int sum in suffixSum)
{
Console.Write(sum + " " );
}
Console.WriteLine();
}
}
|
Javascript
function computeSuffixSum(arr) {
const n = arr.length;
const suffixSum = new Array(n).fill(0);
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
suffixSum[i] += arr[j];
}
}
return suffixSum;
}
function main() {
const arr = [10, 14, 16, 20];
const suffixSum = computeSuffixSum(arr);
console.log( "Suffix sum array:" , suffixSum.join( " " ));
}
main();
|
OutputSuffix sum array: 60 50 36 20
Time Complexity: O(n*n) where n is size of input array. This is because two nested loops are executing.
Auxiliary Space: O(N), to store the suffix sum array.
Approach: To fill the suffix sum array, we run through index N-1 to 0 and keep on adding the current element with the previous value in the suffix sum array.
- Create an array of size N to store the suffix sum.
- Initialize the last element of the suffix sum array with the last element of the original array
suffixSum[n-1] = arr[n-1] - Traverse the original array from N-2 to 0
- For each index i find the suffix sum and store it at suffixSum[i]
- suffixSum[i] = suffixSum[i + 1] + arr[i]
- Return the computed suffix sum array.
Below is the implementation of the above approach to create a suffix sum array:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > createSuffixSum(vector< int > arr, int n)
{
vector< int > suffixSum(n, 0);
suffixSum[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixSum[i] = suffixSum[i + 1] + arr[i];
return suffixSum;
}
int main()
{
vector< int > arr = { 10, 14, 16, 20 };
int N = arr.size();
vector< int > suffixSum = createSuffixSum(arr, N);
cout << "Suffix sum array: " ;
for ( int i = 0; i < N; i++)
cout << suffixSum[i] << " " ;
}
|
Java
import java.util.*;
public class GFG {
static int [] createSuffixSum( int [] arr, int n)
{
int [] suffixSum = new int [n];
for ( int i = 0 ; i < n; i++) {
suffixSum[i] = 0 ;
}
suffixSum[n - 1 ] = arr[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
suffixSum[i] = suffixSum[i + 1 ] + arr[i];
return suffixSum;
}
public static void main(String args[])
{
int [] arr = { 10 , 14 , 16 , 20 };
int N = arr.length;
int [] suffixSum = createSuffixSum(arr, N);
System.out.print( "Suffix sum array: " );
for ( int i = 0 ; i < N; i++)
System.out.print(suffixSum[i] + " " );
}
}
|
Python3
def createSuffixSum(arr, n):
suffixSum = [ 0 for _ in range (n)]
suffixSum[n - 1 ] = arr[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
suffixSum[i] = suffixSum[i + 1 ] + arr[i]
return suffixSum
if __name__ = = "__main__" :
arr = [ 10 , 14 , 16 , 20 ]
N = len (arr)
suffixSum = createSuffixSum(arr, N)
print ( "Suffix sum array: " , end = "")
for i in range ( 0 , N):
print (suffixSum[i], end = " " )
|
C#
using System;
class GFG {
static int [] createSuffixSum( int [] arr, int n)
{
int [] suffixSum = new int [n];
for ( int i = 0; i < n; i++) {
suffixSum[i] = 0;
}
suffixSum[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixSum[i] = suffixSum[i + 1] + arr[i];
return suffixSum;
}
public static void Main()
{
int [] arr = { 10, 14, 16, 20 };
int N = arr.Length;
int [] suffixSum = createSuffixSum(arr, N);
Console.Write( "Suffix sum array: " );
for ( int i = 0; i < N; i++)
Console.Write(suffixSum[i] + " " );
}
}
|
Javascript
<script>
function createSuffixSum(arr, n)
{
let suffixSum = new Array(n).fill(0);
suffixSum[n - 1] = arr[n - 1];
for (let i = n - 2; i >= 0; i--)
suffixSum[i] = suffixSum[i + 1] + arr[i];
return suffixSum;
}
let arr = [10, 14, 16, 20];
let N = arr.length;
let suffixSum = createSuffixSum(arr, N);
document.write( "Suffix sum array: " )
for (let i = 0; i < N; i++)
document.write(suffixSum[i] + " " );
</script>
|
OutputSuffix sum array: 60 50 36 20
Time Complexity: O(N), to traverse the original array for computing suffix sum.
Auxiliary Space: O(N), to store the suffix sum array.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...