티스토리 뷰
쿼리 최적화 알고리즘 개론 – 왜, 언제, 어떻게 최적화할까?
알고리즘 문제를 풀다 보면 이런 문장을 자주 만납니다.
"N개의 데이터와 M개의 쿼리가 주어집니다."
이 문장에서 M이 수만, 수십만, 많게는 백만이 넘어간다면,
단순한 반복문으로는 답을 절대 못 내는 문제일 가능성이 높습니다.
이럴 때 필요한 게 바로 쿼리 최적화 알고리즘입니다.
✅ 쿼리 최적화가 필요한 순간
1. 쿼리 수가 많다 (M이 매우 크다)
예시: 100,000개의 구간 합을 구하시오
→ 단순 for문은 시간 초과.
→ 세그먼트 트리 / 누적합 / Mo’s 알고리즘 사용.
2. 쿼리를 처리하는 순서가 자유롭다 (Off-line)
예시: 쿼리를 정렬해서 더 빠르게 처리할 수 있는가?
→ Mo’s Algorithm의 핵심 개념입니다.
3. 쿼리마다 데이터가 변화한다 (Update + Query 혼합)
예시: 배열의 값을 바꾸면서 질의까지 한다
→ Sqrt Decomposition, Persistent Segment Tree, BIT with Rollback 등 적용.
4. 트리나 그래프 구조 위에서 쿼리한다
예시: 트리에서 어떤 노드 간 거리 합, 특정 노드에 값 더하기 등
→ Mo on Tree, ETT + BIT, HLD, LCA + DP 전략 사용.
📚 쿼리 최적화 알고리즘의 3가지 분류
유형 설명 대표 알고리즘
Offline 처리 | 모든 쿼리를 미리 받아 정렬 또는 전처리로 빠르게 처리 | Mo’s Algorithm, CDQ 분할 정복 |
Online 처리 | 쿼리를 받은 즉시 응답해야 함 | 세그먼트 트리, BIT, HLD |
혼합형 | 데이터 변화 + 쿼리가 동시에 존재 | Persistent Tree, Mo’s with Update, Euler Tour Tree |
🛠 대표 알고리즘 예고편
📌 Mo’s Algorithm
구간 쿼리를 정렬해서 O(√N × M)에 처리하는 마법
→ 정렬 순서만 잘 잡으면 반복문으로도 놀라운 속도!
📌 Sqrt Decomposition
쿼리를 구간 블럭 단위로 쪼개서 처리
→ 간단하지만 강력한 쿼리 최적화 도구
📌 Persistent Segment Tree
과거 시점의 배열 상태를 유지하며 질의
→ 버전 관리가 가능한 데이터구조
📌 Mo on Tree
트리 위에서 구간 쿼리 처리? 가능함.
→ DFS 타임스탬프 + Mo 알고리즘 결합
📌 Union-Find 오프라인
쿼리 순서가 중요하지 않을 때, 더 빠른 구조 가능
→ 예: “이 시점에 x와 y가 연결되어 있었나?”
🎯 이 시리즈의 목표
이 시리즈에서는 위 알고리즘들을 하나하나 뜯어서
✔ 개념 정리
✔ 실제 구현
✔ 실전 문제 적용
까지 전부 다뤄봅니다.
그리고 가능하면 파이썬 코드로 직접 구현해서
실제로 정답 판정을 받을 수 있도록 공유할게요.
👉 다음 글에서는 Mo’s Algorithm의 개념과 구현을 다룹니다.
“구간 쿼리 문제를 정렬로 해결한다?” 이 말이 처음엔 어색할 수 있지만,
막상 구현해보면 정말 깔끔하고 신기합니다.
쿼리최적화, 오프라인쿼리, 온라인쿼리, 알고리즘시리즈, 모스알고리즘, 파이썬알고리즘, 세그먼트트리, 구간쿼리, 쿼리개론, SEO 최적화 10개
'Programming > 알고리즘' 카테고리의 다른 글
Mo’s Algorithm on Tree – 트리에서 구간 쿼리 최적화하는 마법 (0) | 2025.07.08 |
---|---|
Mo’s Algorithm – 쿼리 순서만 바꿨을 뿐인데 속도가 10배 빨라진다고? (0) | 2025.07.07 |
[마무리편] 세그먼트 트리부터 Link/Cut Tree까지: 트리 알고리즘 시리즈 정리와 추천 학습 루트 (0) | 2025.06.23 |
Link/Cut Tree 실전 적용: 동적 MST(Minimum Spanning Tree) 유지 전략 (0) | 2025.06.20 |
[응용편] Link/Cut Tree에 경로 합, 경로 최댓값 추가하기 – Augmented LCT 구현 (0) | 2025.06.17 |
- Total
- Today
- Yesterday
- 프론트엔드
- 딥러닝
- SEO최적화
- Docker
- llm
- nodejs
- kotlin
- JAX
- 파이썬알고리즘
- 백엔드개발
- 웹개발
- Next.js
- CI/CD
- rag
- App Router
- SEO 최적화
- 개발블로그
- REACT
- flax
- PostgreSQL
- AI챗봇
- Ktor
- gatsbyjs
- nextJS
- Python
- fastapi
- 프론트엔드면접
- Prisma
- NestJS
- seo 최적화 10개
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |