웨이블릿 트리(구간 k번째 수) 계산기
값을 반씩 갈라 가며 «작은 쪽으로 갔는가»를 층마다 비트로 남기면 구간 [l,r]의 k번째로 작은 수를 O(log σ)에 찾을 수 있습니다. 층마다 비트벡터와 rank로 다음 구간이 어떻게 좁혀지는지 표로 보여 줍니다.
쉼표나 공백으로 구분합니다. 40개까지.
구간 [0, 5]에서 3번째로 작은 값
2
정렬해서 직접 고른 값(대조군)과 일치 · 값 범위 0~5
층마다 내려가는 과정
| 층 | 값 범위 | 이 층 배열 | 비트 | 구간[l,r] | 간 곳 |
|---|---|---|---|---|---|
| 0 | [0,5] mid=2 | 5 1 4 2 3 0 | 101010 | [0,5] | 왼쪽 (0인 것 3개 중 k=3) |
| 1 | [0,2] mid=1 | 1 2 0 | 010 | [0,2] | 오른쪽 (1인 것 1개 중 k=1) |
값 하나만 남는 리프(2)에 닿으면 끝납니다. 비트 0은 왼쪽(값이 작은 쪽), 1은 오른쪽입니다.
사용 방법
- 1수열을 입력합니다. 값은 0 이상의 정수여야 합니다.
- 2구간 [l,r]과 몇 번째로 작은 값을 찾을지(k)를 정합니다.
- 3층마다 비트벡터가 어떻게 갈리고 구간이 어떻게 좁혀지는지 봅니다.
- 4정렬해서 직접 고른 값(대조군)과 결과가 같은지 확인합니다.
자주 묻는 질문
수열의 부분구간 [l,r] 안에서 k번째로 작은 값을 빠르게 찾기 위한 것입니다. 값의 범위(0~σ−1)를 반씩 나눠 가며 각 원소가 «작은 쪽으로 갔는가»를 층마다 비트 하나로 기록해 두면, 구간 안에서 0의 개수를 세는 것(rank)만으로 다음 층에서 봐야 할 위치 구간이 정확히 정해집니다.
각 층에서 원소를 값 기준으로 나눌 때 원래 순서를 그대로 유지하기(안정 분할) 때문입니다. 그래서 구간 [l,r] 안에서 왼쪽으로 간 개수(rank)를 세면, 그 개수가 곧 다음 층 왼쪽 자식 배열에서의 새 구간 끝점이 됩니다. 순서가 흐트러지면 이 대응이 깨집니다.
루트에서 시작해 구간 [l,r]을 유지하며 내려갑니다. 이번 층에서 구간 안에 왼쪽으로 간 개수(zeros)를 세어, k가 그 이하면 답은 왼쪽 절반에 있고 새 구간은 rank 값으로 정해집니다. 아니면 k에서 zeros를 빼고 오른쪽으로 내려갑니다. 값의 범위가 층마다 반씩 줄어 log₂σ번이면 값 하나만 남는 리프에 닿습니다.
값의 범위가 매 층 절반으로 줄어들기 때문입니다. 원소 개수 n과는 무관하게, 오직 값의 종류 수 σ에만 로그로 비례해 층 수가 정해집니다. 실제 구현에서는 각 층의 비트벡터에 rank를 O(1)로 답하는 자료구조를 얹어 층당 O(1)을 만들지만, 이 계산기는 이해를 위해 단순 선형 탐색으로 rank를 계산합니다.
세그먼트 트리는 구간 합·최솟값처럼 결합법칙을 만족하는 질의에 강하고, 희소 테이블은 구간 최솟값 같은 멱등 연산의 정적 질의에 강합니다. 웨이블릿 트리는 그와 달리 «구간 안에서 몇 번째로 작은 값인가», «구간 안에 특정 값이 몇 개인가» 같은, 값의 순위와 관련된 질의에 특화되어 있습니다.
이름만 같을 뿐 전혀 다릅니다. edu/haar-wavelet은 신호를 저주파·고주파 성분으로 나누는 신호처리의 웨이블릿 변환이고, 이 도구는 정렬·순위 질의를 위한 자료구조입니다. 둘 다 "반으로 나눈다"는 아이디어를 쓰지만 목적과 수학적 배경이 다릅니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이뤄지고 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 무작위 수열(길이 1~12, 값 종류 2~10가지) 20세트에서 가능한 모든 구간과 모든 k에 대해, 정렬해서 직접 고른 값(대조군)과 이 계산기의 결과가 전부 일치하는지 확인했습니다.
- 중복값이 있는 수열, 구간이 원소 하나뿐인 경우도 따로 확인했습니다.
- 각 단계에서 왼쪽으로 간 개수와 오른쪽으로 간 개수를 더하면 그 구간의 길이와 정확히 같은지 검산했습니다.
- 이 계산기는 이해를 돕기 위해 층마다 비트벡터를 선형 탐색으로 세므로, 실제 O(log σ) 구현(비트벡터에 rank 자료구조를 얹은 것)보다 느립니다. 알고리즘의 흐름은 동일합니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.