[c++] 이진 인덱스 트리(Binary Indexed Tree) 데이터 구조
이진 인덱스 트리(Binary Indexed Tree)는 효율적으로 구간 합을 계산하는 데 사용되는 데이터 구조입니다. 주로 배열의 각 요소들의 값을 변경하고 구간 합을 계산하는 연산이 반복되는 경우에 활용됩니다.
이진 인덱스 트리의 작동 원리는 무엇인가요?
이진 인덱스 트리는 각 노드가 특정 인덱스 범위에 대한 합을 저장하며, 구간 합을 계산하는 데 사용됩니다. 각 노드의 값은 구간의 시작부터 현재 인덱스까지의 요소 합을 나타냅니다. 따라서 구간 합을 계산하기 위해서는 여러 노드 값을 합산하여 구간 합을 얻을 수 있습니다.
예를 들어, 인덱스 6의 노드의 값은 인덱스 5와 6에 있는 요소의 합을 나타내고, 인덱스 7의 노드의 값은 인덱스 1부터 7까지의 요소 합을 나타냅니다. 이러한 구조를 통해 각 노드를 거쳐가면서 구간 합을 계산할 수 있습니다.
이진 인덱스 트리의 구현 및 활용 예제
#include <iostream>
#include <vector>
using namespace std;
class BinaryIndexedTree {
public:
vector<int> BIT;
int n;
BinaryIndexedTree(int size) {
n = size;
BIT.assign(n+1, 0);
}
void update(int index, int val) {
while (index <= n) {
BIT[index] += val;
index += (index & -index);
}
}
int query(int index) {
int sum = 0;
while (index > 0) {
sum += BIT[index];
index -= (index & -index);
}
return sum;
}
};
int main() {
vector<int> arr = {1, 2, 3, 4, 5};
BinaryIndexedTree bit(arr.size());
for (int i = 0; i < arr.size(); i++) {
bit.update(i+1, arr[i]);
}
cout << "Sum of elements in arr[0..2] is " << bit.query(3) << endl;
cout << "Sum of elements in arr[2..4] is " << bit.query(5) - bit.query(2 - 1) << endl;
return 0;
}
위의 예제는 C++로 작성된 이진 인덱스 트리의 구현과 활용 예제입니다. 배열의 각 요소를 변경하고, 구간 합을 계산하는 과정이 나타나 있습니다.
결론
이진 인덱스 트리는 각 노드가 특정 인덱스 범위에 대한 합을 저장하여 구간 합을 효율적으로 계산하는 데 사용되는 데이터 구조입니다. 이를 통해 배열 요소의 값을 변경하고 구간 합을 빠르게 계산할 수 있습니다.