티스토리 뷰
분할 정복 알고리즘 (Divide-and-Conquer Algorithm)
주어진 문제의 입력을 분할하여 부분문제(subproblem)로 만들어 해결하는 방식
대부분 분할 정복 알고리즘은 단순 분할이 아닌, 분할된 부분문제들로 부분해를 찾아야 한다.
예시 문제로 크기가 n인 입력값이 있다고 가정하고
n을 3개로 분할한다 할때 각 부분문제의 크기가 $$n/2$$라고 하면
각 입력 크기의 반은 n/2라고 할수있다.
이제 입력 크기가 1이 되어 더 이상 분할할 수 없는 k번째까지 분할을 한다면,
$$n$$$$n/2$$$$n/2^2 (n/4)$$$$n/2^3 (n/8)$$$$n/n^4 (n/16)$$$$...$$$$n/2^k$$
위와 같은 순서가 성립된다.
이때, 입력크기가 1이되는 총 횟수를 k는 $$n/2^k$$이므로
$$n/2^k = 1$$$$k = log_2n$$
위 시간 복잡도가 성립된다.
분할 정복 알고리즘의 분류
분할 정복 알고리즘은 분할되는 "부분문제의 수 / 크기에 따라 분류"가 될 수 있다.
- 문제가 k개로 분할되고, 부분문제 크기가 1/n으로 감소하는 알고리즘
- k = n = 2 (합병 정렬, 최근접 점의 쌍 찾기, 공제선 문제)
- k = 3, n = 2 (큰 정수의 곱셈)
- k = 4, n = 2 (큰 정수의 곱셈)
- k = 7, n = 2 (스트라센(Strassen)의 행렬 곱셈 알고리즘)
- 문제가 2개로 분할되고, 부분문제 크기가 일정하지 않은 크기로 감소하는 알고리즘 (퀵 정렬)
- 문제가 2개로 분할되나, 그중 1개 부분문제가 고려할 필요 없으며, 부분문제 크기가 1/2로 감소하는 알고리즘 (이진탐색)
- 문제가 2개로 분할되나, 그중 1개가 고려할 필요가 없으며, 부분문제 크기가 일정치 않게 감소하는 알고리즘 (선택 문제 알고리즘)
- 부분문제의 크기가 1, 2개씩 감소하는 알고리즘 (삽입 정렬, 피보나치수의 계산 등)
단순하며 비효율적 : 삽입, 선택, 버블
복잡하며 효율적 : 퀵, 힙, 합병, 기수
'Computer > Algorithm' 카테고리의 다른 글
[알고리즘] 깊이우선 탐색 (DFS, Depth-First Search) (0) | 2023.07.31 |
---|---|
[알고리즘 / 분할정복] #1 합병 정렬 (Merge Sort) (0) | 2021.04.16 |
[알고리즘] 최대공약수, 최소공배수 (0) | 2020.12.31 |
[알고리즘] 알고리즘 복잡도 (0) | 2020.10.18 |
[알고리즘] 알고리즘이란? (0) | 2020.10.18 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 상속
- thread
- 함수
- 게임수학
- 할당
- 메모리
- dynamic_cast
- 크기
- 수학
- New
- CPU
- 명령어
- 초기화
- const
- c++
- 구조
- 프로세스
- 입출력
- 인터럽트
- 클래스
- 컴파일
- 멀티스레드
- 백준
- 포인터
- static_cast
- 알고리즘
- 스레드
- 레지스터
- malloc
- 운영체제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함