합 배열을 이용하여 시간 복잡도를 더 줄이기 위해 사용하는 특수한 목적의 알고리즘입니다.
합 배열
구간 합 알고리즘을 활용하려면 먼저 합 배열을 구해야 합니다. 배열 A가 있을 때 합 배열 S는 다음과 같이 정의 합니다.
S[i] = A[0] + A[1] + A[2] + ... + A[i] + A[i-1] // A[0] 부터 A[i]까지 합
Index | 0 | 1 | 2 | 3 | 4 |
A | 1 | 2 | 3 | 4 | 5 |
S | 1 | 3 | 6 | 10 | 15 |
합 배열이 없이 A[i]부터 A[j]까지의 배열 합을 구하게 되면 최악의 경우 i = 0, j = n 이면 시간 복잡도는 O(N)입니다. 이런 경우 초기에 값을 입력할 때 합 배열을 함께 만들어 사용하면 O(1)시간으로 구할 수 있습니다.
합 배열을 만들 때는 S[i] = S[i -1] + A[i] 의 공식을 이용해 만들 수 있습니다.
구간 합
위의 합배열을 이용하면 구간 합 또한 쉽게 구할 수 있습니다. i에서 j까지의 구간 합을 구하는 공식은 다음과 같습니다.
S[j] - S[i-1]
Index | 0 | 1 | 2 | 3 | 4 |
A | 1 | 2 | 3 | 4 | 5 |
S | 1 | 3 | 6 | 10 | 15 |
위 의 표를 기준으로 A[2]부터 A[4]까지의 구간 합을 구한다고 예를 들겠습니다.
합 배열 이용 X : A[2] + A[3] + A[4]
합 배열 이용 O : S[4] - S[1]
예시를 보듯이 구간합의 범위가 커지면 커질수록 더욱 많은 연산을 해야하지만 합배열과 구간 합 공식을 잘 활용한다면 시간 복잡도를 줄이는데 많은 도움을 줄 것입니다.
'Algorithm > 이론' 카테고리의 다른 글
선택 정렬 (Selection Sort) - JAVA (0) | 2023.05.17 |
---|---|
버블 정렬 (Bubble Sort) - JAVA (0) | 2023.05.17 |
스택(Stack)과 큐(Queue) (0) | 2023.05.17 |
배열(Array)과 리스트(List) (0) | 2023.05.16 |
시간 복잡도 (Time complexity) (0) | 2023.05.16 |