- 분할(divide) - 문제의 입력을 여러 개의 작은 문제로 분할
- 정복(conquer) - 작은 문제들을 순환적으로 분할
- 결합(combine) - 작은 문제에 대해 정복된 해를 결합하여 원래 문제의 해를 구함
그러나 경우에 따라 결합단계 없이 분할단계와 정복단계만을 통해 해가 구해지기도 한다.
분할된 작은 문제는 원래의 문제에 비해 입력 크기만 작아진 것이며 문제 자체는 원래와 동일하며 분할정복을 적용한 알고리즘의 분할과정에서 분할되는 작은 문제의 개수와 크기는 아래와 같다
이진탐색 - 크기가 n인 문제를 크기가 n/2인 두 개의 문제로 분할
합병정렬 - 크기가 n인 문제를 크기가 n/2인 두 개의 문제로 분할
선택문제 - 크기가 n인 문제를 크기는 감소하지만 일정하지 않은 크기의 두 개의 작은 문제로 분할 ( 그중 하나의 작은 문제는 처리 대상에서 제외 )
퀵정렬 - 크기가 n인 문제를 크기는 감소하지만 일정하지 않은 크기의 두 개의 작은 문제로 분할
Dynaminc Programming
처리과정
1. 주어진 문제에 대한 최적해를 제공하는 점화식 도출
2. 가장 작은 소문제부터 점화식의 해를 구한 뒤 테이블에 저장
3. 테이블에 저장된 해를 이용하여 점진적으로 큰 상위 문제의 해를 구한다
동적 프로그래밍을 이용한 알고리즘
Greedy(욕심쟁이)
동전 거스름돈 문제
각 알고리즘 비교
분할 정복 | 동적 프로그래밍 | 욕심쟁이 | |
---|---|---|---|
계산 방식 | 순활 분할 하향식 | 최적해 산출 상향식 | |
주 사용 분야 | 최적화 문제 해결 | 근사치 추정 | |
대표 알고리즘 | 최소, 최대값 찾기, 이진 탐색, 병합 정렬 | 피보나치 수열 알고리즘 | 근사 알고리즘, 그리디 알고리즘 |
설명 | 문제를 분할하여 계산하며 분할된 문제의 중복이 일어나지 않는다 | 문제를 분할하여 계산하며 분할된 문제의 중복(반복)이 발생하며 '같은 문제는 구할 때마다 정답이 같다'라는 조건을 통해 큰 문제를 해결한다. | 현재 상태에서 가장 좋다고 판단되는 것을 선택하여 진행되는 방법. 효율적이고 간단하지만 최적의 답은 아닐 수 있다. |