3. POSTECH Computer Algorithm Team
- 1학기 때 segment tree를 하면서, 처음으로 query problem을 접하였을 것이다.
- 오늘은 이런 query problem을 푸는 방법 중 하나인, sqrt(n) algorithm에 대해 배울 것이다.
Query problems
4. POSTECH Computer Algorithm Team
- 1학기 때 했던 query 문제를 떠올려 보자.
- N개의 수로 이루어진 수열, A[1…N]이 있고, 다음과 같은 query가 주어진다.
Query1) A[p…q]의 최댓값을 출력
Query2) A[idx]를 val로 업데이트
Sqrt Decomposition Sqrt Decomposition
5. POSTECH Computer Algorithm Team
Sqrt Decomposition
- Segment tree를 떠올려보자.
- Segment tree는 구간들을 적절히 생성하여, 효율적으로 다루는 자료구조이다.
- 만약, A[1…N]을 동일한 크기의 구간들로 관리하면 어떨까?
Ex) A[1…a], A[a+1…2a], … , A[ka+1…N]
6. POSTECH Computer Algorithm Team
Sqrt Decomposition
Query1)
- 구간 [p, q]가 들어오면 p, q가 속해있는 구간을 찾는다.
- p, q가 각각 속해있는 구간들에서의 최댓값과, 그 사이의 구간들에서의 최댓값을 비교한다.
Query2)
- idx가 들어오면 idx가 속해있는 구간을 찾는다.
- 그 구간의 값과 A[idx]의 값을 update한다.
Q1) 속해있는 구간을 어떻게 찾을까?
Q2) 각각의 시간복잡도는?
7. POSTECH Computer Algorithm Team
Sqrt Decomposition
- 이렇게 일정한 구간(버킷)들로 쪼개어 관리하는 방법을 sqrt decomposition이라고 한다.
- 왜냐하면 버킷 크기를 sqrt(n)으로 하는 것이 가장 효율적이기 때문이다.
- 시간복잡도 O(Q sqrt(N)).
8. POSTECH Computer Algorithm Team
- 앞의 sqrt decomposition 까지는 온라인 알고리즘이라고 할 수 있다.
- 온라인 알고리즘 : 입력 받은 쿼리를 바로 계산하여 결과를 출력
- 오프라인 알고리즘 : 입력 받은 쿼리들을 모아서, 한 번에 계산하여 결과를 출력
Offline Algorithm Offline Algorithm
9. POSTECH Computer Algorithm Team
Offline Algorithm
- 그럼 앞에서 언급한 query problem을 offline algorithm으로 풀어보자.
- 이제는 update 없이, Q개의 구간 [p, q]들이 들어온다고 생각하자.
Q) 효율적으로 해결할 수 있는 오프라인 알고리즘을 생각해보자.
10. POSTECH Computer Algorithm Team
Offline Algorithm
A)
- 구간들을 p순으로 정렬한다.(p가 같으면 q순으로)
- 만약 이전 구간이 [p1, q1], 현재 입력 받은 구간을 [p2, q2]라고 하자.
- Case #1 : p1 == p2, q1 < q2
- Case #2 : p1 < p2, q1 > q2
- Case #3 : p1 < p2, q1 < q2
Q) 각각 해결하는데 걸리는 시간복잡도는?
11. POSTECH Computer Algorithm Team
Offline Algorithm
A)
- 모두 다 최악의 경우, O(N)이다.
- 따라서 전체 시간복잡도는 O(QN), 기존의 알고리즘보다 느리다.
- 더 빠르게 할 수는 없을까?
12. POSTECH Computer Algorithm Team
- Mo’s Algorithm은 sqrt decomposition과 offline query를 합친 것이라고 볼 수 있다.
- 일반적으로 segment tree를 사용할 때, 각 구간의 값을 O(1)만에 처리할 수 없는 문제들을 해결하는데 사용한다.
Mo’s Algorithm Mo’s Algorithm
13. POSTECH Computer Algorithm Team
Mo’s Algorithm
- [p, q]들이 들어오면, p순으로 정렬하는 것이 아닌, p / (bucket size)로 정렬한다!
- 시간복잡도는?
14. POSTECH Computer Algorithm Team
Mo’s Algorithm
1) P의 변화
- (bucket size)를 sqrt(N)이라고 하자. 그러면 bucket의 수는 sqrt(N)개
- 그러면 각 query마다 sqrt(N)씩의 연산이 생긴다고 볼 수 있다.(bucket을 옮겨다니는 cost)
- 한 번에 여러 bucket을 넘어갈 수 있지만, 모든 query 통틀어서 O(N)이 걸린다.
- 전체 시간복잡도 : O(N + Q sqrt(N))
2) Q의 변화
- 각 bucket별로 오름차순 되어 있다.
- 즉, 각 bucket별로 O(N)이 걸린다고 볼 수 있다.
- 전체 시간복잡도 : O(N sqrt(N))
15. POSTECH Computer Algorithm Team
https://www.acmicpc.net/problem/13547
https://www.acmicpc.net/problem/8462
https://www.acmicpc.net/problem/2042
https://www.acmicpc.net/problem/2912
오늘의 문제