평방 분할(구간 질의) 계산기
배열을 √n 크기 버킷으로 나눠 구간 합·최솟값·최댓값을 O(√n)에 답합니다. 버킷 크기를 바꿔 가며 실제 연산 횟수를 재어 「왜 하필 √n인가」가 U자 곡선으로 보이게 했습니다.
공백이나 쉼표로 구분합니다. 60개까지 봅니다.
이 배열의 최적은 √(n/2) ≈ 3칸입니다.
3~15번째의 합
67
원소 5개 + 버킷 2개 = 7번 봤습니다. 곧이곧대로 훑으면 13번입니다.
버킷과 요약값
| 버킷 | 범위 | 값 | 합 | 이번 질의 |
|---|---|---|---|---|
| 0 | 1~4 | 4 7 2 9 | 22 | 하나씩 봄 |
| 1 | 5~8 | 1 8 3 6 | 18 | 요약값만 읽음 |
| 2 | 9~12 | 5 10 2 7 | 24 | 요약값만 읽음 |
| 3 | 13~16 | 4 9 1 6 | 20 | 하나씩 봄 |
| 4 | 17~20 | 8 3 5 2 | 18 | 건드리지 않음 |
가운데 버킷은 요약값 한 번만 읽고 넘어갑니다. 양 끝의 잘린 버킷만 원소를 하나씩 보므로, 최악에도 자투리 2b개 + 버킷 n/b개면 끝납니다.
버킷 크기를 바꿔 가며 실제로 재어 본 연산 횟수
| 버킷 크기 | 버킷 수 | 평균 연산 | 최악 | 이론 2b + n/b |
|---|---|---|---|---|
| 1 | 20 | 7.33 | 20 | 22 |
| 2 | 10 | 5.05 | 12 | 14 |
| 3 | 7 | 4.76 | 10 | 12.67 |
| 4 (지금) | 5 | 5.05 | 11 | 13 |
| 5 | 4 | 5.43 | 12 | 14 |
| 6 | 4 | 5.62 | 13 | 15.33 |
| 7 | 3 | 6.13 | 14 | 16.86 |
| 8 | 3 | 6.27 | 16 | 18.5 |
| 9 | 3 | 6.65 | 18 | 20.22 |
| 10 | 2 | 7.33 | 20 | 22 |
| 11 | 2 | 7.33 | 20 | 23.82 |
| 12 | 2 | 7.33 | 20 | 25.67 |
| 13 | 2 | 7.33 | 20 | 27.54 |
| 14 | 2 | 7.33 | 20 | 29.43 |
| 15 | 2 | 7.33 | 20 | 31.33 |
| 16 | 2 | 7.33 | 20 | 33.25 |
| 17 | 2 | 7.33 | 20 | 35.18 |
| 18 | 2 | 7.33 | 20 | 37.11 |
| 19 | 2 | 7.33 | 20 | 39.05 |
| 20 | 1 | 7.33 | 20 | 41 |
모든 (시작, 끝) 쌍을 실제로 물어보고 센 값입니다. 가장 적은 곳이 b = 3이고 이론 최적 √(n/2) ≈ 3과 가깝습니다. 양 끝으로 갈수록 나빠지는 U자가 「왜 하필 √n인가」의 답입니다.
사용 방법
- 1배열을 공백이나 쉼표로 구분해 넣고 구간 연산(합·최솟값·최댓값)을 고릅니다.
- 2버킷 크기를 정하고 질의 구간을 넣으면 답과 연산 횟수가 나옵니다.
- 3버킷 표에서 어느 버킷이 요약값만 읽히고 어느 버킷이 하나씩 읽히는지 봅니다.
- 4아래 표에서 버킷 크기를 바꿔 가며 잰 평균 연산 횟수가 U자를 그리는 것을 확인합니다.
- 5가장 적은 곳이 √(n/2) 근처에 오는 것을 봅니다.
자주 묻는 질문
배열을 크기 b짜리 버킷으로 잘라 버킷마다 요약값(합·최솟값 등)을 미리 구해 두는 방법입니다. 구간 질의가 「왼쪽 자투리 + 통째로 들어가는 버킷들 + 오른쪽 자투리」로 나뉘어, 자투리는 최대 2b개를 하나씩 보고 가운데는 버킷 요약값 최대 n/b개만 읽습니다.
질의 비용이 대략 2b + n/b인데, 이것을 b로 미분해 0으로 두면 b = √(n/2)가 나오기 때문입니다. 그때 비용이 2√(2n)이라 O(√n)이 됩니다. b가 작으면 버킷 개수가 많아지고 크면 자투리가 길어져 양쪽으로 다 손해라, 연산 횟수가 U자 곡선을 그립니다.
구현이 훨씬 짧고, 합치기 어려운 연산에도 붙기 때문입니다. 세그먼트 트리는 두 구간의 답을 합쳐 큰 구간의 답을 만들 수 있어야 하는데 최빈값이나 「서로 다른 값의 개수」는 그것이 안 됩니다. 평방 분할은 버킷마다 통계를 통째로 들고 있으면 되므로 그런 연산도 다룰 수 있습니다.
연산에 따라 다릅니다. 합처럼 되돌릴 수 있으면 원소를 고치고 버킷 요약값에서 옛 값을 빼고 새 값을 더하면 되어 O(1)입니다. 최솟값·최댓값은 지운 값이 그 버킷의 최솟값이었으면 다음 최솟값을 알 길이 없어 버킷을 다시 훑어야 하므로 O(b)입니다.
됩니다. 이 점이 차분 배열과 다릅니다. 차분 배열은 갱신을 전부 받고 마지막에 한 번 읽는 경우에만 이기지만, 평방 분할은 버킷 요약값을 그때그때 고칠 수 있어 질의와 갱신이 섞여 들어와도 각각 O(√n) 안팎으로 처리합니다.
요약값을 쓸 수 없어 원소를 하나씩 봅니다. 이때 비용이 최대 b라 전체 최악값에는 영향을 주지 않지만, 구현에서 이 경우를 따로 처리하지 않으면 왼쪽 자투리와 오른쪽 자투리가 겹쳐 같은 원소를 두 번 세게 됩니다. 이 도구는 그 경우를 나눠 처리합니다.
경진 프로그래밍에서 구간 질의를 빠르게 짜야 할 때, 특히 세그먼트 트리로 표현하기 어려운 연산일 때 씁니다. Mo's 알고리즘처럼 질의를 미리 다 받아 정렬하는 기법도 같은 √n 발상 위에 서 있고, 데이터베이스의 블록 단위 통계(존 맵)도 본질적으로 같은 구조입니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- 연산 횟수 곡선은 모든 (시작, 끝) 쌍을 실제로 물어보고 센 값입니다. 이론 어림과 나란히 놓았습니다.
- 실측 최소는 평균 기준이라 이론 최적(최악 기준) √(n/2)보다 조금 크게 나올 수 있습니다.
- 표를 보이기 위해 배열은 60개까지만 받습니다. 알고리즘 자체는 크기 제한이 없습니다.
- 결과가 정말 맞는지 확인하려고 곧이곧대로 훑은 값을 함께 냅니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.