Algorithm/Theory

세그먼트 트리(Segment tree) - 구간 합 구하기

Jinlib 2018. 4. 25. 22:39

세그먼트 트리 또는 인덱스 트리

1. 정의

위와같이 각 노드에는 구간에 대한 정보가 저장이 되어있는 트리를 의미한다.
일반적으로 구간의 합 또는 곱, 구간의 최대값 또는 최솟값을 의미합니다.

예)
배열의 데이터 수  :  8개
배열의 데이터 A[8] = {1,2,3,4,5,6,7,8}
목적 : 구간에 대한 합

세그먼트 이론시 높이 3인 트리가 만들어지며 오른쪽 위에 숫자만큼 각 구간에 대한 정보를 담고 있다.


위와 같이 각 노드는 자식에 대한 합을 포함 하고 있다.


배열은 0부터 인덱스가 시작하므로,

A[3] ~ A[6]까지의 합을 구한다고 가정할때, 아래와 같이 주황색 부분의 합만 구하면 된다. 

즉, 4+11+7 = 22로 부분에 대한 합을 쉽게 구할 수 있습니다.

위와같이 수행하면 부분의 합에 대한 부분을
높이가 O(log n)일때, O(log n)만큼의 시간을 들여서 완료할 수 있습니다.


세그먼트 트리에 관한 백준문제

백준 문제 => https://www.acmicpc.net/problem/2042  (  구간 합 구하기 )


참고한 사이트

http://isukorea.com/blog/home/waylight3/216


추가개념

만약에 구간에 대한 값을 증가시키거나 감소시킬 때는 아래의 개념을 사용하면 됩니다.

+) Lazy propagation

https://www.acmicpc.net/blog/view/26

http://bowbowbow.tistory.com/4

백준 문제 => https://www.acmicpc.net/problem/10999 ( 구간 합 구하기2 )


'Algorithm > Theory' 카테고리의 다른 글

그래프 탐색 알고리즘(Graph Search Algorithm)  (0) 2022.01.29
재귀함수의 시간복잡도  (0) 2018.04.14
알고리즘 분석  (0) 2018.04.14
정렬 알고리즘 - Quick Sort  (0) 2018.04.13
quick sort(1)  (0) 2018.04.13