합배열

정의

:  기존의 배열을 전처리한 배열

S[i] = A[0]  + A[1]   + A[2]   + A[3] + ··· + A[i-1]   + A[i]

 

시간 복잡도

: O(1)

- 합 배열을 미리 구해두면 구간 합을 O(1)의 시간복잡도로 계산할 수 있다.

 

공식

S[i] = S[i-1] + A[i]

class PrefixSum{
    private long[] sum;
    
   	//생성자
    PrefixSum(int[] arr){
    	sum = new long[arr.length];
        sum[0] = arr[0]; 
        for(int i = 1; i < arr.length; i++){
            sum[i] = sum[i-1] + arr[i];
        }
    }
}

 

필요성

: 합배열을 미리 구해놓으면 구간합을 구하는 시간 복잡도가 O(N)에서 O(1)로 감소한다.

=> 합 배열 미리 구해두면 구간 합은 한 번의 계산으로 구할 수 있다.

/*

합배열 없이 구간합 구하는 경우

- A[i]부터 A[j]까지 배열 합 구하기

최악의 경우: i = 0, j = N => 시간복잡도: O(N)

*/

 

구간 합

공식

: i~j까지 구간 합

S[j] - S[i - 1]

class PrefixSum{
    private long[] sum;
    
   	//생성자
    PrefixSum(int[] arr){
    	sum = new long[arr.length];
        sum[0] = arr[0]; 
        for(int i = 1; i < arr.length; i++){
            sum[i] = sum[i-1] + arr[i];
        }
    }
    
    //필요한 구간합 반환
    //s: 시작 인덱스, e: 끝 인덱스
    public long prefixSum(int s, int e){
    	//처음부터 시작하는 구간합
    	if(s == 0)
        	return sum[e];
            
        //특정 인덱스부터 시작하는 구간합
        return sum[e] - sum[s - 1];
    }
}

 

예시

: 인덱스 2~5까지의 구간 합

S[5] = A[0]  + A[1]   + A[2]   + A[3] + A[4] + A[5]

S[1] A[0]  + A[1]

구간 합 = S[5] - S[1] = A[2]   + A[3] + A[4] + A[5]   => O(1)

'CS > DataStructure&Algorithm' 카테고리의 다른 글

투포인터 알고리즘  (1) 2025.05.14
슬라이딩 윈도우 알고리즘  (1) 2025.05.05
선형구조 - 큐  (1) 2025.04.30
선형구조 - 스택  (0) 2025.04.30
검색 알고리즘  (0) 2025.04.29

+ Recent posts