자료구조Hard#178
Segment Tree는 어떤 쿼리에 적합한 자료구조인가요?
#자료구조#SegmentTree#RangeQuery#알고리즘
답변 포인트
범위 질의와 중간 업데이트를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
Segment Tree는 구간 합, 최솟값, 최댓값 같은 범위 질의와 값 갱신을 모두 O(log n)에 처리합니다. 업데이트가 많은 구간 문제에 적합합니다.
Segment Tree는 배열 구간에 대한 질의와 업데이트를 빠르게 처리하는 트리 자료구조입니다. 구간 합, 구간 최솟값/최댓값처럼 결합 가능한 연산을 O(log n)에 처리할 수 있어 데이터가 자주 바뀌는 구간 쿼리에 적합합니다.
핵심 개념
- 각 노드는 배열의 특정 구간 정보를 저장합니다.
- 질의 구간이 노드 구간과 완전히 겹치면 저장된 값을 바로 사용합니다.
- 점 업데이트 또는 구간 업데이트 후 관련 노드만 다시 계산합니다.
동작 방식 또는 판단 기준
이 주제를 이해할 때는 다음 순서로 보면 실무 적용이 쉬워집니다.
- 무엇을 해결하려는가: 성능, 표현력, 안정성, 접근성 중 어떤 문제를 줄이려는지 확인합니다.
- 전제 조건은 무엇인가: 정렬 여부, 브라우저 지원, 네트워크 특성, 동시성 조건처럼 성립해야 하는 조건을 점검합니다.
- 비용은 어디서 발생하는가: 시간 복잡도, 메모리, 캐시, 재시도, 렌더링 비용처럼 병목 지점을 나눠 봅니다.
- 실패 시 어떤 문제가 생기는가: 잘못 적용했을 때의 버그나 운영 리스크를 함께 고려합니다.
실제 예시
Text
arr = [2, 1, 5, 3]
root: [0,3] sum=11
left: [0,1] sum=3
right:[2,3] sum=8
query sum(1,3)
[1,1] + [2,3] = 1 + 8 = 9JavaScript
// 예: 실시간 매출 배열에서 특정 기간 합계를 자주 묻고, 개별 날짜 매출도 수정됨
// 단순 prefix sum은 업데이트가 O(n)이지만 segment tree는 O(log n)실무에서 주의할 점
- 연산이 결합 법칙을 만족해야 트리 노드 결과를 합칠 수 있습니다.
- 구간 업데이트가 많으면 lazy propagation이 필요해 구현 난이도가 올라갑니다.
- 데이터가 변경되지 않는 정적 배열이라면 prefix sum이나 sparse table이 더 단순할 수 있습니다.
실무 적용 가이드
- 구간 합/최솟값/최댓값 + 업데이트가 함께 있으면 Segment Tree를 고려합니다.
- 인덱스 범위와 inclusive/exclusive 규칙을 일관되게 정해야 버그를 줄일 수 있습니다.
- 실무 DB 집계에서는 materialized view, OLAP, Fenwick Tree 같은 대안도 비교합니다.
함께 연결해서 보면 좋은 키워드
Segment Tree, Range Query, Lazy Propagation, Fenwick Tree
정리
Segment Tree는 배열 구간에 대한 질의와 업데이트를 빠르게 처리하는 트리 자료구조입니다. 다만 개념 자체보다 중요한 것은 적용 조건과 한계를 함께 이해하는 것입니다. 작은 예제에서는 단순해 보여도 실제 서비스에서는 성능, 보안, 유지보수성, 접근성 요구사항이 함께 얽히므로, 문제의 성격을 먼저 파악한 뒤 적절한 도구로 선택하는 것이 좋습니다.