티스토리 뷰

알고리즘/자료구조

인덱스 트리

산타 브라운 2018. 9. 1. 15:58

2042 구간 합 구하기 : https://www.acmicpc.net/problem/2042


1. 인덱스 트리:

- 포화 이진트리 형태의 자료 구조

- 리프 노드 : 배열에 적혀있는 수 (제일 아랫단 노드들)

- 내부 노드 : 왼쪽 자식과 오른쪽 자식의 합

tree[i] = tree[i*2] + tree[i*2+1];


2. 트리의 기본

int tree[n];

루트부터 노드 index를 1이라고 한다면,

- 루트 -> 왼쪽 자식노드 : root idx * 2

- 루트 -> 오른쪽 자식노드 : root idx * 2 + 1

- 자식노드 -> 루트 : leaf idx / 2


3. 인덱스 트리에서 구간의 합을 구하는 쿼리 수행 방법

- start index : 해당 노드 index가 홀수일 경우 확인

- end index : 해당 노드 index가 짝수일 경우 확인

            //구간 합: b~c 값들의 합

            int start = nidx+b-1;

            int end = nidx+c-1;

            long long int sum=0;

            while(start <= end){

                if(start%2 == 1) sum += tree[start]; //왼쪽 index는 홀수일 경우 확인

                if(end%2 == 0) sum += tree[end]; //오른쪽 index는 짝수일 경우 확인

                start = (start+1)/2;

                end = (end-1)/2;

            }

            cout << sum << "\n";



4. 초기 트리 구성

: 제일 밑단 리프노드들이 1,000,000개일 때, 사이즈를 넉넉하게 *4 함.

long long int tree[1000000*4];


5. 트리 변화량 갱신

long long int delta; // 변화량

// 자신과 조상노드들에게 모두 변화량을 적용

while(node > 0){

    tree[node] += delta;

    node /= 2;

}


'알고리즘 > 자료구조' 카테고리의 다른 글

Heap & 우선순위 큐(Priority Queue)  (0) 2018.09.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/10   »
일 월 화 수 목 금 토
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함