Professional Documents
Culture Documents
5장 분할 정복
5장 분할 정복
CHAPTER
05
분할 정복
지난 주 강의 요약
– Ω- 표기 : 점근적 하한
알고리즘 Chapter 05 분할 정복 2
Algorithm
분할 정복 설계 전략
1. 분할 (Divide) 단계
- 문제를 같은 유형의 여러 개의 더 작은 부분 문제들로 나눈다 .
- 부분 문제는 풀기 쉬울 때까지 계속 나눈다 .
2. 정복 (Conquer) 단계
- 부분 문제들을 보통 재귀적으로 해결하여 해를 구한다 .
3. 합병 (Merge) 단계
- 문제에 대한 해를 구하기 위해 부분 문제들의 해를 합친다 .
알고리즘 Chapter 05 분할 정복 3
Algorithm
분할 정복 전략 예 : 전쟁
알고리즘 Chapter 05 분할 정복 4
Algorithm
분할 정복 전략
알고리즘 Chapter 05 분할 정복 5
Algorithm
최댓값과 최솟값 찾기
쉬운 전략
1. 최댓값을 찾는다 . -- 비교 횟수 : n – 1
2. 남은 배열 요소들의 최솟값을 찾는다 . -- 비교 횟수 : n – 2
총 비교 횟수 = (n – 1) + (n – 2) = 2n - 3
알고리즘 Chapter 05 분할 정복 6
Algorithm
분할 정복 전략
3. 2 에서 찾은 두 개의 최댓값들과 두 개의
최솟값들을 비교하여 전체 배열의 최댓값과
최솟값을 구한다 .
알고리즘 Chapter 05 분할 정복 7
Algorithm
분할 정복 알고리즘의 진행 과정
알고리즘 Chapter 05 분할 정복 8
Algorithm
알고리즘 Chapter 05 분할 정복 9
실행 트리
Algorithm
비교 횟수 :
알고리즘 Chapter 05 분할 정복 10
Algorithm
합병 정렬
쉬운 전략
1. 최솟값을 찾는다 .
2. 남은 요소들을 같은 방법을 사용하여 재귀적으로 정렬한다 .
분석
- 비교 횟수 : (n - 1) + (n - 2) + + 2 + 1 =
‘ 균형 취하기 발견법’ 사용 안함
- 크기 k, 의 배열을 크기 1 의 부분 배열 ( 최솟값 요소 ) 과 크기 (k
- 1) 의 부분 배열 ( 최솟값 요소를 제외한 남은 요소들 ) 로 나눈다 .
알고리즘 Chapter 05 분할 정복 11
Algorithm
분할 정복 전략
2. 왼쪽 반과 오른쪽 반을 각각 정렬한다 .
알고리즘 Chapter 05 분할 정복 12
합병 정렬의 진행 과정
Algorithm
알고리즘 Chapter 05 분할 정복 13
Algorithm
합병 정렬 알고리즘
알고리즘 Chapter 05 분할 정복 14
Algorithm
합병 알고리즘
Merge(x, y, z)
임시 저장을 위해 다른 배열을 사용
알고리즘 Chapter 05 분할 정복 15
Algorithm
Merge 메소드
// 정렬된 부분 배열 A[low . . mid] 와 A[mid+1 . . high] 를 합병한다 .
MERGE(A[ ], low, mid, high) {
1 크기가 (high + 1) 인 배열 B 를 만든다
2 h = low; i = low; j = mid +1
3 while (i mid && j high) {
4 if (A[i] A[ j] { B[h] = A[i]; i = i + 1 }
5 else { B[h] = A[ j]; j = j + 1 }
6 h = h+1
}
7 if (i > mid)
8 for (k = j; k high; k++) { B[h] = A[k]; h = h + 1 }
9 else
10 for (k = i; k mid; k++) { B[h] = A[k]; h = h + 1 }
11 for (k = low; k high; k++) A[k] = B[k];
}
알고리즘 Chapter 05 분할 정복 16
Algorithm
시간복잡도 분석
가정 : n = , k>1
T(n)
알고리즘 Chapter 05 분할 정복 17
Algorithm
합병 정렬 알고리즘 분석
관찰
– 자주 분할정복 프로그램에서 재귀를 제거하면 더 효율적인 프로그램을
얻을 수 있다 .
비 재귀적인 Mergesort
크기 =1 크기 =2 크기 =4 크기 =8
비재귀 합병 정렬의 진행 과정
알고리즘 Chapter 05 분할 정복 19
Algorithm
비재귀 합병 정렬 알고리즘
mergeSort2(A[ ], n)
// 배열 A[0 . . n-1] 를 비재귀 합병 정렬을 이용하여 정렬
1 size = 1
2 while (size < n) {
3 for (i = 0; i < n; i = i + 2 * size)
4 Merge(A, i, i + size – 1, i + 2 * size – 1)
5 size = size * 2
}
분석 : 단계
각 단계는 (n) 비교가 필요하다 .
따라서 비교 횟수는 이다 .
알고리즘 Chapter 05 분할 정복 20
Algorithm
합병 정렬의 단점
입력을 위한 메모리 공간 ( 입력 배열 ) 외에
추가로 입력과 같은 크기의 공간 ( 임시 배열 ) 이
별도로 필요
2 개의 정렬된 부분을 하나로 합병하기 위해
합병된 결과를 저장할 공간이 필요하기 때문
알고리즘 Chapter 05 분할 정복 21
Algorithm
합병 정렬의 응용
알고리즘 Chapter 05 분할 정복 22
Algorithm
빠른 정렬 (Quicksort)
절대적으로 가장 빠른 정렬 알고리즘은
아니지만 평균적으로 매우 효율적임
평균 시간복잡도 :
최악 시간복잡도 : )
알고리즘 Chapter 05 분할 정복 23
기본 아이디어
Algorithm
알고리즘 Chapter 05 분할 정복 24
Algorithm
빠른 정렬의 진행 과정
알고리즘 Chapter 05 분할 정복 25
Algorithm
빠른 정렬 알고리즘
알고리즘 Chapter 05 분할 정복 26
Algorithm
기준 요소에 의한 분할 후 빠른 정렬
기준 요소 p = A[low]
알고리즘 Chapter 05 분할 정복 27
Algorithm
분할 알고리즘
2 단계 알고리즘
1. 배열을 다음과 같이 재배열한다 .
알고리즘 Chapter 05 분할 정복 28
Algorithm
분할 알고리즘
주 아이디어
경우 1: S[i] S[low] 이면 i = i + 1
S[ j] S[low] 이면 j = j - 1
알고리즘 Chapter 05 분할 정복 29
Algorithm
분할 알고리즘의 진행 과정
p = A[low]
알고리즘 Chapter 05 분할 정복 30
Algorithm
분할 알고리즘의 분할 중 상황
알고리즘 Chapter 05 분할 정복 31
Algorithm
분할 알고리즘
partition(A[ ], low, high)
// 입력 : 배열 A[0 . . n - 1] 의 부분 배열 A[low . . high], low < high
// 출력 : A[low . . high] 의 분할 후 기준 요소의 최종 위치 ( 지수 ) 를 반환
1 i = low + 1
2 j = high
3 while (i j) {
4 if (A[i] A[low]) i = i + 1
5 else if (A[ j] > A[low]) j = j – 1
6 else { A[i] A[ j]
7 i=i+1
8 j=j–1
}
}
9 A[low] A[ j]
10 return j
알고리즘 Chapter 05 분할 정복 32
Algorithm
예 : 빠른 정렬
알고리즘 Chapter 05 분할 정복 33
Algorithm
최악 시간복잡도 분석
알고리즘 Chapter 05 분할 정복 34
Algorithm
빠른 정렬의 응용
알고리즘 Chapter 05 분할 정복 35
Algorithm
분할 정복이 부적절한 경우
경우 2: 크기 n 인 문제가 크기의 거의 n 개의 부분 문제
들로 분할 . c 는 상수
알고리즘 Chapter 05 분할 정복 36
Algorithm
토끼 문제
한 쌍의 토끼들은 한 달이 될 때에 한 쌍의
토끼를 낳고 두 달이 될 때에 또 다른 한 쌍의
토끼를 낳는다 . 내가 방금 한 쌍의 새로 태어난
토끼들을 샀다면 지금부터 n 번째 달에 몇 쌍의
토끼들이 태어날까 ?
알고리즘 Chapter 05 분할 정복 37
Algorithm
토끼 문제의 설계와 분석
알고리즘 Chapter 05 분할 정복 38
Algorithm
재귀 알고리즘
F(n)
// n 번째 피보나찌 수 을 분할 정복 기법을 이용하여 //
계산한다
// 입력 : 양의 정수 n
// 출력 : n 번째 피보나찌 수
1
알고리즘 Chapter 05 분할 정복 39
Algorithm
5 번째 피보나찌 수를 구하는 실행 트리
알고리즘 Chapter 05 분할 정복 40
동적 계획 알고리즘
Algorithm
주 . 시간복잡도 :
알고리즘 Chapter 05 분할 정복 41
Algorithm
요약
예 : 최댓값과 최솟값 찾기 , 합병 정렬 , 빠른 정렬
대개 분할 또는 합병 단계 중 하나가 쉽다 .
예 : 이진 탐색은 1 개의 부분 문제로 분할
알고리즘 Chapter 05 분할 정복 42