티스토리 뷰

분할 정복 알고리즘

주어진 문제의 입력을 분할하여 부분문제(subproblem)로 만들어 해결하는 방식

대부분 분할 정복 알고리즘은 단순 분할이 아닌, 분할된 부분문제들로 부분해를 찾아야 한다.

 


분할 정복 알고리즘 예제

예제로 크기가 n인 입력값이 있을때,

n을 2개로 분할때 각 부분문제의 크기가 n/2이면 각 입력 크기의 반은 n/2라고 할수있다.

이제 입력 크기가 1이 되어 분할할 수 없는 k번째까지 간다면 아래와 같은 순서가 성립된다.

 

이때, 입력크기가 1이되는 총 횟수를 k는 n/(2^k) 이므로 다음 시간 복잡도가 성립된다.

 


분할 정복 알고리즘의 분류

💡 분할 정복 알고리즘은 분할되는 "부분문제의 수 / 크기에 따라 분류"가 될 수 있다.

단순하며 비효율적 : 삽입, 선택, 버블

복잡하며 효율적 : 퀵, 힙, 합병, 기수

 

  1. 문제가 k개로 분할되고, 부분문제 크기가 1/n으로 감소하는 알고리즘
    1. k = n = 2 (합병 정렬, 최근접 점의 쌍 찾기, 공제선 문제)
    2. k = 3, n = 2 (큰 정수의 곱셈)
    3. k = 4, n = 2 (큰 정수의 곱셈)
    4. k = 7, n = 2 (스트라센(Strassen)의 행렬 곱셈 알고리즘)
  2. 문제가 2개로 분할되고, 부분문제 크기가 일정하지 않은 크기로 감소하는 알고리즘 (퀵 정렬)
  3. 문제가 2개로 분할되나, 그중 1개 부분문제가 고려할 필요 없고 부분문제 크기가 1/2로 감소하는 알고리즘 (이진탐색)
  4. 문제가 2개로 분할되나, 그중 1개가 고려할 필요가 없고 부분문제 크기가 일정치 않게 감소하는 알고리즘 (선택 문제 알고리즘)
  5. 부분문제의 크기가 1, 2개씩 감소하는 알고리즘 (삽입 정렬, 피보나치수의 계산 등)

 

출처 :  https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함