Post

TIL- 누적합(구조합) 알고리즘이란?

TIL- 누적합(구조합) 알고리즘이란?

2024-06-03

오늘의 학습 🌠


1


  • 👨🏻‍💻 누적합 핵심 개념
    • 수들이 나열되어 있을 때 특정 구간의 합을 쉽게 구해주는 알고리즘

1


  • 🙋🏻‍♀️ : 인덱스 3부터 10까지의 누적합(구간합)은 무엇인가요?

  • 👨🏻‍🏫 : 4+6+2+3+5+9+23+4 = 56입니다.

  • 🙋🏻‍♂️ : 인덱스 8부터 10까지의 누적합(구간합)은 무엇인가요?

  • 👨🏻‍🏫 : 9+23+4 = 36입니다.

  • 🙅🏻‍♀️ : 이 과정은 너무 비효율적이지 않은지.. 만약 만 번이 넘는 과정이라면?


→ 이러한 과정을 토대로 Prefix Sum, 누적합(구간합) 알고리즘을 고안해내게 되었습니다.

1

  • “S” : 합 배열, “A” : 원본 배열
1
2
3
4
5
6
S[0] = A[0];

for(int i = 1; i < 8; i++)
{
		S[i] = S[i-1] + A[i];
}
  • 여기서 S[3] = 25는 A[0]+A[1]+A[2]+A[3] 입니다.

  • 즉, A[0]부터 자기 원본 배열이 A[3] 까지의 합을 의미합니다.

  • 그렇다면 40은 무엇일까요?

  • A[0]부터 자기 인덱스 값인 A[6]까지의 합을 의미할 것입니다.

  • 우리는 이런 합 배열을 가지고 누적합을 간단히 구할 수 있습니다!


🙋🏻‍♂️ : 인덱스 3부터 6까지의 누적합(구간합)을 구하고 싶어요!

💻 : S[6] - S[2] = 40 - 18 = 22

  • 확인 : A[3]~A[6] : 7+8+4+3 = 22

🙋🏻‍♀️ : 인덱스 1부터 7까지의 누적합(구간합)을 구하고 싶어요!

💻 : S[7] - S[0] = 41 - 5 = 36

→ S[1]+ S[1] + S[2]+S[3]+S[4]+S[5]+S[6]+S[7]까지의 합을 구하는 과정보다 굉장히 간편해 집니다.


❓ 원본 배열 A에 대해서 i~j까지 구간합을 구할 때 S 합배열로 구한다고 하면 어떻게 해야될까요?

  • S[j] - S[i-1]
  • 3~8까지 구간합이라면 S[8]-S[2]이므로

🍮 누적합 단점

1

  • 원본 배열의 인덱스 3번째의 수가 바뀌었을 경우 합 배열의 인덱스 3번부터 끝까지 바꾸어 주어야 합니다.

추가 🕤


1

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.