별 잡다
분할 정복 : Divide and Conquer
pwerty
2025. 3. 21. 17:09
분할 정복은 큰 문제를 작은 문제로 나누어 해결하는 기법인데,
문제의 사이즈가 바뀔지언정 문제의 내용이 바뀌진 않다보니 재귀와 연관지어서 많이 공부하게 된다.
아주 간단한 분할 정복의 예제는 병합 정렬이 있다.
- 병합 정렬은 기존의 정렬 대상으로 주어진 배열을 더 이상 나눌 수 없을 때까지 분할한다.
- 더 이상 나눌 수 없는 경우부터 각 배열을 정렬한다.
- 나눈 배열들을 병합하며 정렬된 형태로 마무리한다.
- 분할 정복의 시간 복잡도는 n logn이다. 효율적인 정렬 알고리즘 중 하나 이다.
전체적인 진행구조는 이렇게 된다 :
- 분할 : 큰 문제를 여러 개로 나눈다.
- 정복 : 나눠진 작은 문제를 각각 독립적으로 해결한다. 보통은 재귀함수를 사용한다.
- 결합 : 작은 문제들의 해답을 모아 기존 문제의 해답을 도출한다.
특징은 이렇다.
- 작은 문제들은 동일한 문제 형태를 가진다. 그럼에도 독립적이다.
- 재귀랑 많이 연관지어서 구현된다.
- 문제라는 단어 사용 특성 상 어떤 특정한 문제 해결에 국한되지 않고, 많은 부분에서 사용 될 수 있다.
분할 정복은 재귀랑 많이 엮이는 만큼 장단점도 재귀함수랑 많이 엮인다.
- 장점
- 효율적이다. 복잡한 문제도 처리를 쉽게 생각 할 수 있다.
- 각 하위 문제는 독립적이니 병렬 처리로써 계산 속도를 크게 향상 시킬 수 있다.
- 특징에서도 언급했지만 특정한 문제 해결에 국한되지 않는다.
- 단점
- 병합 과정에서 추가적인 비용이 발생 할 수 있다.
- 같은 하위 문제를 여러 번 반복 할 수 있다. 이 부분의 경우, 이전 하위 문제의 결과를 기억한다거나 동적 계획법(DP)이 필요하다.