Algorithm/알기 쉬운 알고리즘
2021. 4. 30. 18:49
- 알기쉬운 알고리즘(양성봉 저, 생능 출판) 책을 바탕으로 작성한 내용이다.
03. 분할 정복 알고리즘
주어진 문제의 입력을 분할하여 문제를 해결하는 방식의 알고리즘이다.
분할된 입력의 문제(부분문제, Subproblem)에 대해 동일한 알고리즘을 적용하여 부분해를 얻으며, 이를 취합해서 원래 문제의 해를 얻는다.
- 더 이상 분할할 수 없을 때까지 계속 부분문제로 분할한다.
문제 : 크기가 n인 입력을 3개로 분할하고, 각각 분할된 부분문제의 크기가 n/2이라고 할 때, 총 몇 번 분할하여야 더 이상 분할할 수 없는 크기인 1이 될까?
- 총 분할 횟수를 k라고 하면, n/2k = 1이므로 k는 log2n이 된다.
분할 정복 알고리즘의 분류
문제가 a개로 분할되고, 부분문제의 크기가 1/b로 감소하는 알고리즘
a b 알고리즘 2 2 합병 정렬(3.1절), 최근접 점의 쌍 찾기(3.4절), 공제선 문제(연습문제 25번) 3 2 큰 정수의 곱셈(연습문제 21) 4 2 큰 정수의 곱셈(연습문제 20) 7 2 스트라센의 행렬 곱셈(연습문제 22) 문제가 2개로 분할되고, 부분문제의 크기가 일정하지 않은 크기로 감소하는 알고리즘
- 퀵 정렬(3.2절)
문제가 2개로 분할되나, 그중에 1개의 부분문제는 고려할 필요가 없고 부분문제의 크기가 1/2로 감소하는 알고리즘
- 이진탐색(1.2절)
문제가 2개로 분할되나, 그중에 1개의 부분문제는 고려할 필요가 없고 부분문제의 크기가 일정하지 않은 크기로 감소하는 알고리즘
- 선택 문제 알고리즘(3.3절)
부분문제의 크기가 1, 2개씩 감소하는 알고리즘
삽입 정렬(6.3절)
피보나치 수의 계산(3.5절)
3.1 합병 정렬 (Merge Sort)
3.2 퀵 정렬 (Quick Sort)
3.3 선택 문제 (Selection Problem)
3.4 최근접 점의 쌍 찾기(Closest Pair)
3.5 분할 정복을 적용하는 데 있어서 주의할 점
만약 분할될 때마다 분할된 부분문제의 입력 크기의 합이 기존의 입력 크기보다 매우 커진다면 분할 정복 알고리즘을 적용하는게 부적절할 수 있다.
- 예를 들어 n번째 피보나치 수를 구할 때 재귀 호출을 사용하면, 분할 후 입력 크기가 거의 2배씩 늘어나므로 반복문을 사용하는게 효율적이다.
분할 뿐만 아니라 취합 과정에도 신경을 써야 효율적인 알고리즘이 탄생한다.
'Algorithm > 알기 쉬운 알고리즘' 카테고리의 다른 글
최단 경로 찾기(Shortest Path) (0) | 2021.05.03 |
---|---|
최소 신장 트리(Minimum Spanning Tree) (0) | 2021.05.03 |
선택 문제 (Selection Problem) (0) | 2021.04.30 |
02. 알고리즘을 배우기 위한 준비 (0) | 2021.04.30 |
01. 알고리즘의 첫걸음 (0) | 2021.04.30 |