알고리즘

[ 알고리즘 ] 분할정복법

Chars4785 2019. 9. 26. 13:49

@ 궁금한 이유

문제 풀이 방법중에 하나로 완전 탐색이 안될 경우 사용하는 방법중에 하나라서 공부하고 싶었다. 


@ 공부

분할 정복법( Divide & Conquer )

> 문제를 소문제로 분할

> 각각의 소문제를 해결

> 소문제의 해결 결과를 이용하여 전체 문제를 해결

 

# 대표적인 정렬

## 합병정렬 ( Merge Sort )

> 재귀 호출을 이용한 대표적인 정렬

정확히 가운데를 나누고 나서 각각을 다시 합병정렬 해서 합친다.

T(N) : N 개의 숫자를 정렬하는데 걸리는 시간 

T(N) = 2* T(N/2) + O(N)

> O(N log N)

## 퀵정렬 ( Quick Sort )

> 재귀호출을 이용한 대표적인 정렬

> 피벗 기준으로 작은 것은 왼쪽에 큰 것은 오른쪽으로 나누고

> 작은 문제 2개를 다시 피벗으로 정렬 

> 분할 정복법은 거의 대부분 재귀를 통해서 구현하는 경우가 많다.

 

## 연속 부분 최대합을 분할 정복법으로 풀어 보기

완전탐색법으로 하면 : 연속된 부분을 선택하였을 때, 그 최대 합을 출력

전체시간: 가능한 경우의 수 * 하나의 경우에 걸리는 시간

소문제1, 소문제2 각각의 최대합을 구하자 하지만 중간에 자른 부분을 포함한 것은 고려하지 않았다.

> 자른 지점까지 고려 한다면 전체경우를 고려 하게 된다.