본문 바로가기

study-knou/알고리즘

3. 분할정복 알고리즘

728x90

분할정복 방법의 원리

- 순환적으로 문제를 푸는 하향식 접근 방법

- 주어진 문제의 입력을 더 이상 나룰 수 없을 때까지 두 개 이상의 작은 문제로 순환적으로 분할하고, 이렇게 분할된 작은 문제들을 각각 해결한 후 그 해를 결합하여 원래 문제의 해를 구하는 방식

 

- 특징

- 분할된 작은 문제는 원래 문제와 동일

-> 단, 입력 크기만 작아짐

- 분할된 문제는 서로 독립적

-> 순환적 분할 및 결과 결합이 가능

 

- 각 순환 호출 시의 처리 과정

- 분할 : 주어진 문제를 여러 개의 작은 문제로 붑ㄴ할

- 정복 : 작은 문제들을 순환적으로 분할, 만약 작은 문제가 더 이상 분할되지 않을 정도로

크기가 충분히 작다면 순환 호출 없이 작은 문제에 대한 해를 구함

- 결합 : 작은 문제에 대해 정복된 해를 결합하여 원래 문제의 해를 구함

 

적용 알고리즘에서의 분할 과정

- 이진탐색, 합병 정렬, 퀵 정렬, 선택 문제

- 이진 탐색 : 분할된 한 쪽만 사용

- 합병 정렬 : 분할된 쪽 다 사용

- 퀵 정렬 : 크기가 동일하지 않게 분할, 다 사용

- 선택 문제 : 크기가 동일하지 않게 분할하고 한쪽만 사용

 

이진 탐색 개념과 원리

- 정렬된 상태의 데이터에 대해 적용 가능한 효과적인 탐색 방법

- 오른차순으로 정렬되었다고 가정

- 탐색 방법

- 배열의 가운데 원소와 탐색키 x를 비교

1) 탐색키 = 가운데 원소 -> 탐색 성공

2) 탐색키 < 가운데 원소 -> 이진탐색(크기 1/2의 왼쪽 부분배열) 순환 호출

3) 탐색키 > 가운데 원소 -> 이진탐색(크기 1/2의 오른쪽 부분배열) 순환 호출

-> 탐색을 반복할 때마다 대상 원소의 개수가 1/2씩 감소

 

- 분할 : 배열의 가운ㄷ에 원소를 기준으로 왼쪽과 오론쪽 부분배열로 분할

탐색키와 가운데 원소가 같으면, 해당 원소의 배열 인덱스를 반환/종료

- 정복 : 탐색키 x가 가운데 원소보다 작으면 왼쪽 부분배열을 대상으로 이진 탐색을 순환 호출,

크면 오른쪽 부분배열을 대상으로 이진 탐색을 순환 호출

- 결합 : 부분배열데 대한 탐색 결과가 직접 반환되므로 결합이 불필요  


입력 크기 n일 때 최대 분할 횟수는?

- n/2^k = 1 -? k = log(n) 

- 최대 비교 횟수는? 최대 분할 횟수 + 1

성능 분석

- T(n) = T(n/2) + O(1), T(n)=logn

특징

- 입력이 정렬된 리스트에 대해서만 적용 가능

- 삽입/삭제 연산 시 데이터의 정렬 상태 유지가 필요

- 평균 n/2개의 데이터 이동

- 삽입/삭제가 빈번할 경우 부적절


퀵 정렬

- 특정 원소를 기준으로 주어진 배열을 두 부분배열로 분할하고,

각 부분배열에 대해서 퀵 정렬을 순환적으로 적용하는 방식

- 오름차순으로 정렬한다고 가정

- 피벗

- 두 부분배열로 분할할 때 기준이 되는 특정 원소

- 보통 주어진 배열의 첫번째 원소로 지정

- 개념과 원리

- 피벗에 제자리를 잡도록 하여 정렬하는 방식

- 분할 : 피벗 기준 두 부분으로 분할

- 정복 : 두 부분에 퀵 정렬 순환적이용, 각 부분배열 정렬

- 결합 : 필요 없음

- 알고리즘

- 두 부분 분할, 왼쪽 정렬, 오른쪽 정렬


'study-knou > 알고리즘' 카테고리의 다른 글

동적 프로그래밍 알고리즘(2)  (0) 2019.04.03
동적 프로그래밍 알고리즘 (1)  (0) 2019.04.01
분할정복 알고리즘 2  (0) 2019.03.31
알고리즘 소개2  (0) 2019.03.14
알고리즘 - 1강. 알고리즘 소개  (0) 2019.03.11