티스토리 뷰

반응형

쿼리 최적화 알고리즘 개론 – 왜, 언제, 어떻게 최적화할까?


알고리즘 문제를 풀다 보면 이런 문장을 자주 만납니다.
"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개

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함
반응형