Wavelet Tree: 값 범위 이진 분할
Wavelet Tree, wavelet-tree, 웨이블릿 트리
정의
Wavelet Tree 는 시퀀스의 값 범위를 이진 분할하며 만든 트리 자료구조입니다. k-th smallest in range, rank/select, count in range 등을 O(log |Σ|) 에 답합니다.
- |Σ| = 값 범위, N = 시퀀스 길이
- 공간: O(N log |Σ|)
- 전처리: O(N log |Σ|)
- 쿼리: O(log |Σ|)
핵심 아이디어
각 레벨에서 값 범위를 반으로 나누어 왼쪽 반 (0) / 오른쪽 반 (1) 인지 비트 시퀀스를 만듭니다. 재귀적으로 각 반에 대해 반복.
input: [3 1 4 1 5 9 2 6] (범위 [1..9])
level 0 (mid=5): [0 0 0 0 0 1 0 1] 0→[3 1 4 1 5 2], 1→[9 6]
level 1 왼쪽: [0 0 0 0 1 0] ... 재귀
응용
- K-th smallest in [l, r]: Persistent Segtree 대체
- Range count of values in [x, y]: O(log |Σ|)
- 문자열 접미사 배열 위 처리: LCP 등
참고
이 글의 용어 (3개)
- Order Statistics Tree (OST): rank/select 지원 BSTalgorithm
- 정의 Order Statistics Tree 는 각 노드에 서브트리 크기 를 추가로 저장한 균형 BST 입니다. 두 가지 새 연산을 O(log N) 에 지원합니다. - rank(…
- Persistent Segment Tree (영속 세그): 시점별 스냅샷algorithm
- 정의 Persistent Segment Tree 는 매 갱신마다 이전 버전을 그대로 유지하면서 새 버전을 만드는 세그먼트 트리입니다. 각 버전은 루트 포인터 로 식별됩니다. 핵심…
- Suffix Array (접미사 배열)algorithm
- 정의 Suffix Array (SA, 접미사 배열) 는 문자열 s 의 모든 접미사를 사전순 정렬한 인덱스 배열. SA[i] = 시작 위치 (0-indexed). 보통 LCP (L…
💬 댓글