2025. 11. 12. 00:15ㆍAlgorithm & PS/기타
오랜만에 글을 올려봅니다.
"DSU 알고리즘에서 크기를 기준으로 union을 하면 O(NlogN)이 된다." 이게 Small-to-Large technique으로 전 알고 있습니다.
다만 이게 왜 O(NlogN)인가는 좀 직관적으로 이해가 잘 안 갔었는데... 최근에 인사이트가 생겨 이를 공유해보고자 합니다.
자... DSU 알고리즘에서 모든 element를 Union을 할 때 생기는 시간복잡도는 "모든 element가 이동한 횟수"가 될 것입니다.
그러면 각 element가 몇 번 정도 움직이는 지 파악하면 되겠죠?
그러면 각 element가 언제까지 움직여야 할까요?
조금 비틀어서 생각해보면 현재 element가 속한 집합의 크기가 N이 될 때 까지가 됩니다.
현재 element a가 속한 집합의 크기가 sz[a]라고 합시다.
그리고 집합의 크기가 sz[b]인 집합과 union해야 하는 상황이라고 보죠.
만약에 sz[a] > sz[b]라면 sz[a] := sz[a]+sz[b]가 되긴 합니다. 다만, element a는 움직이지 않죠.
그러나 sz[a] < sz[b]라면 sz[b] := sz[a]+sz[b]가 되고 element a는 움직이게 됩니다.
그러면 element a가 속한 집합은 크기가 sz[a]에서 sz[a] + sz[b] > 2 * sz[a]가 됩니다.
적어도 element a 가 속한 집합의 크기가 2배 이상이 되는 경우에 element a가 움직이게 되는거죠!
그러면 element a는 최대 몇 번을 움직이는 걸까요?
한 번 움직일 때 적어도 element a가 속한 집합의 크기 sz[a]는 sz[a] * 2 이상이 됩니다.
그러면 총 움직이는 횟수는 대략... sz[a] * 2 ^ (움직인 횟수) = N 이므로 움직인 횟수 > logN 정도 되겠네요.
따라서 각 element는 O(logN) 정도 움직이게 됩니다.
그러면 총 element가 움직인 횟수는 O(NlogN)이 되겠죠.
그래서 Small-to-Large Technique이 O(NlogN)이 되는 겁니다.
누군가에겐 이게 매우 당연할 수 있긴 할텐데...
저는 이걸 처음 본 걸 기준으로 대략 2년 정도 지나서야 직관적으로 이해되었습니다.
그래서 이걸 제가 이해한 대로 나름 풀어서 공유해보고자 적었습니다.
이 글이 도움되셨다면 좋겠습니다!
'Algorithm & PS > 기타' 카테고리의 다른 글
| 왜 히스토그램 문제는 O(N)인가? (0) | 2024.05.07 |
|---|---|
| PS 문제를 풀 때 유용한 팁들 (0) | 2024.02.07 |
| 2023년도 PS 회고록 (1) | 2024.01.08 |
| HSAT 8차 Softeer 정기 역량 진단 합격! (0) | 2023.12.28 |
| 나는 어떻게 PS 및 코딩테스트 문제들을 푸는가? (0) | 2023.12.27 |