[c++] 세그먼트 트리를 이용한 검색
세그먼트 트리(segment tree)는 효율적인 범위 조회를 위해 사용되는 자료 구조입니다. 이 구조를 사용하면 배열과 같은 시퀀스 데이터를 효과적으로 다룰 수 있습니다. 이는 대규모 데이터에서 주어진 범위 내의 값에 대한 조회 및 연산을 빠르게 수행할 수 있게 해줍니다.
세그먼트 트리란?
세그먼트 트리는 주어진 배열 혹은 리스트를 사용하여 구성되며, 각 노드는 해당 구간의 값을 나타냅니다. 이 구간을 효과적으로 나누어 관리함으로써, 주어진 범위에 대한 조회 연산을 $O(\log n)$의 시간 복잡도로 수행할 수 있습니다.
세그먼트 트리의 사용
아래 예제는 C++을 사용하여 세그먼트 트리를 구현하여 범위 내의 최솟값을 조회하는 간단한 코드입니다.
#include <vector>
#include <climits>
using namespace std;
class SegmentTree {
private:
vector<int> tree;
int n;
int build(vector<int>& arr, int node, int start, int end) {
if (start == end) {
tree[node] = arr[start];
return tree[node];
} else {
int mid = (start + end) / 2;
tree[node] = min(build(arr, 2 * node + 1, start, mid), build(arr, 2 * node + 2, mid + 1, end));
return tree[node];
}
}
int query(int node, int start, int end, int left, int right) {
if (right < start || end < left) return INT_MAX;
if (left <= start && end <= right) return tree[node];
int mid = (start + end) / 2;
return min(query(2 * node + 1, start, mid, left, right), query(2 * node + 2, mid + 1, end, left, right));
}
public:
SegmentTree(vector<int>& arr) {
n = arr.size();
tree.assign(4 * n, 0);
build(arr, 0, 0, n - 1);
}
int query(int left, int right) {
return query(0, 0, n - 1, left, right);
}
};
이 구현은 주어진 배열을 바탕으로 세그먼트 트리를 구축하고, 트리에서 최솟값을 조회하기 위한 query
함수를 제공합니다.
이제, 세그먼트 트리를 사용하여 배열의 범위 내에서의 조회를 간단하게 수행할 수 있습니다.
결론
세그먼트 트리는 주어진 범위에 대한 조회 및 연산을 빠르게 수행하기 위한 효과적인 자료 구조로, 대규모 데이터 처리 및 검색 문제를 효과적으로 해결할 수 있습니다. C++을 사용한 위의 예시 코드를 통해 세그먼트 트리를 더 잘 이해할 수 있을 것입니다.
더 많은 자료 구조 및 알고리즘에 대한 내용은 이 링크를 참고해주세요.