Topic

Mo’s Algorithm

JackerLab 2025. 5. 16. 00:00
728x90
반응형

개요

Mo’s Algorithm은 범위 쿼리(range query)를 다수 처리해야 하는 상황에서 전체 쿼리를 오프라인으로 정렬한 후 슬라이딩 윈도우 기법을 이용해 효율적으로 처리하는 알고리즘입니다. 주로 수열에서의 구간 합, distinct 수, 빈도 등 다양한 누적 정보 질의 문제에 사용되며, 쿼리 수가 많고 온라인 처리가 불가능할 때 유용합니다. 쿼리 순서를 정렬하여 윈도우 이동량을 줄이는 것이 핵심 전략입니다.


1. 개념 및 정의

항목 설명
정의 Mo’s Algorithm은 쿼리들을 sqrt(n) 블록 단위로 정렬한 후, 슬라이딩 윈도우로 범위 연산을 최적화하는 오프라인 쿼리 처리 알고리즘입니다.
목적 범위 쿼리 문제에서 쿼리 이동량을 줄여 성능 향상
필요성 쿼리 수(Q)가 많고, 데이터 크기(N)에 따라 naive한 반복 처리 방식은 비효율적

Mo’s Algorithm은 시간 복잡도를 O((N + Q) * √N) 수준으로 낮출 수 있습니다.


2. 핵심 원리 및 절차

단계 설명 주요 연산
쿼리 정렬 왼쪽 인덱스를 √N 블록 기준으로 정렬하되, 오른쪽 인덱스로 tie-break O(Q log Q) 정렬
윈도우 확장/축소 현재 쿼리 범위에 따라 윈도우 좌우 포인터 조절 add/remove 연산 수행
누적 정보 업데이트 쿼리 결과를 위한 상태 변수 갱신 카운터, 배열, 맵 등을 이용
결과 저장 및 출력 쿼리 순서에 맞춰 답 기록 오프라인이므로 쿼리 인덱스 유지 필요

Mo’s Algorithm의 성능은 add(i), remove(i)의 시간 복잡도에 따라 달라집니다.


3. 시간 복잡도 분석

항목 설명
정렬 O(Q log Q)
각 쿼리당 add/remove 평균적으로 O(√N) 이동
총 수행 시간 O((N + Q) * √N) (add/remove 비용이 O(1)일 때)
공간 복잡도 O(N + Q) (count 배열, 결과 저장용 등)

Mo’s Algorithm은 Q가 많을수록, 그리고 online 쿼리보다 offline 정렬이 가능할수록 효과적입니다.


4. 사용 예시 및 확장

유형 문제 예시 고려사항
수열에서의 distinct 수 구간 [l, r]에 서로 다른 숫자 개수 카운터 배열 활용
특정 수 빈도 구간 질의 구간 [l, r]에서 수 x의 등장 횟수 맵 또는 frequency 배열 사용
구간의 XOR/AND/OR 등 구간의 XOR 합 연산 성질상 add/remove 구현 필수
시간에 따른 변경 포함 (Extended Mo) 쿼리 중간에 수열 변경 포함 변경 기록과 rollback 처리 필요

Mo의 확장은 변경 쿼리 포함(시간 블록 정렬), 이차원 적용(행렬 슬라이딩) 등 다양하게 가능.


5. 구현 팁

항목
쿼리 정렬 기준 왼쪽 블록 번호 정렬 후, 오른쪽 인덱스는 지그재그 정렬 (짝수는 오름차순, 홀수는 내림차순)
인덱스 0 기반 처리 add/remove 시 경계 조건 주의
쿼리 인덱스 유지 오프라인 결과 저장 시 original_index 필수
시간 제한 주의 쿼리 수가 10⁵ 이상일 경우 최적화된 add/remove 필요
STL 활용 C++의 map, vector, deque 등 유용

효율적인 구현을 위해 입출력 속도 개선(fast IO), 캐싱 최적화도 병행 필요.


6. 장점과 한계

장점 설명
빠른 쿼리 응답 반복 계산 제거로 성능 향상
쉬운 확장성 다양한 누적 연산에 맞게 응용 가능
경량화된 구조 트리 구조, 세그트리보다 가볍고 구현 간단
한계 설명
온라인 쿼리 불가 모든 쿼리를 미리 알고 있어야 함
실시간 대응 불가 쿼리 도중 상태 변화가 있으면 적용 어려움
add/remove 구현 필요 연산 로직이 단순하지 않으면 어렵다

7. 결론

Mo’s Algorithm은 수많은 오프라인 쿼리를 빠르게 처리해야 하는 상황에서 매우 효과적인 알고리즘입니다. 슬라이딩 윈도우와 블록 정렬이라는 간단한 아이디어를 바탕으로, 복잡한 자료구조 없이도 경로 질의 문제를 효율적으로 해결할 수 있습니다. 특히 알고리즘 대회나 실용적인 로그 분석, 범위 빈도 통계 등에 유용하며, 알고리즘 학습자에게는 쪼갬과 정렬의 조합으로 최적화를 달성하는 좋은 예시가 됩니다.

728x90
반응형

'Topic' 카테고리의 다른 글

LongNet  (0) 2025.05.16
FlashAttention  (0) 2025.05.16
Link-Cut Tree  (0) 2025.05.15
OpenTitan  (1) 2025.05.15
hICN (Hybrid Information-Centric Networking)  (1) 2025.05.15