- 분할 정복법 (divide-and-conquer)
- 분할 => 해결하기 쉽도록, 문제를 여러개의 작은 부분으로 나눔
- 정복 => 작게 나뉘어진 문제를 해결
- 통합 => 필요에 따라 해결된 답을 모음
- ==>> 하향식(Top-down) 접근법
- Binary search using recursive method (이분검색, 재귀알고리즘)
- 문제 : 크기가 n인 정렬된 배열에서 x가 있는지 결정하기
- 입력 : 비내림차순으로 정렬된 배열(1~n), 찾고자하는 항목(x)
- 출력 : x가 존재할 경우 해당 위치, 없는 경우 0
- 합병 정렬 (Merge Sort)
- 문제 : n개의 정수를 비내림차 정렬
- 입력: 크기가 n인 배열
- 출력: 비내림차순으로 정렬된 배열
- 공간복잡도 향상 시킨 알고리즘 (after. 기억공간 사용 X)
- 합병정렬 알고리즘 (before)
- 빠른 정렬 (퀵소트, Quick sort)
- 사실상 분할교환정렬이 더 옳은 표현
- 문제 : n개의 정수를 비내림차순으로 정렬
- 입력 : 크기가 n인 배열
- 출력 : 비내림차순으로 정렬된 배열
- 기본 알고리즘 --> 분할 + 교환
- 퀵소트 기본 알고리즘
- 분할
- 문제 : 배열을 2개로 쪼갬
- 입력 : 인덱스 low, high. 인덱스 low~high에 해당하는 부분배열
- 출력 : 부분배열의 기준점(피봇, pivot), pivot point
Quick Sort example
#include <stdio.h>
int array[10] = {10,5,2,9,7,6,4,1,8,3};
void partition(int low, int high, int* pivotpoint)
{
int i, j, pivotitem,swap;
pivotitem = array[low];
j = low;
for(i = low + 1; i <= high; i++)
{
if (array[i] < pivotitem) {
j++;
swap=array[j];
array[j] = array[i];
array[i] = swap;
}
}
*pivotpoint=j;
swap=array[low];
array[low] = array[j];
array[j] = swap;
}
void quick_sort(int low, int high)
{
int pivotpoint;
if( high > low )
{
partition(low, high, &pivotpoint);
quick_sort(low, pivotpoint-1);
quick_sort(pivotpoint+1, high);
}
}
int main(void)
{
int i;
printf("Original Array : ");
for( i=0 ; i<10; i++)
printf("%d ",array[i]);
printf("\n");
quick_sort(0, 9);
printf("\nSorted Array : ");
for( i=0 ; i<10; i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}
- 행렬 곱셈 (Matrix multiplication)
- 문제 : n * n 크기의 행렬의 곱 구하기기
- 입력 : n*n 크기의 행렬 A, B
- 출력 : 행렬 곱의 결과 행렬 C
- 쉬트라센 방법 : https://ko.wikipedia.org/wiki/%EC%8A%88%ED%8A%B8%EB%9D%BC%EC%84%BC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
- 큰 정수의 표현
- 배열 요소마다 각 자릿수 표현
- 큰 정수의 덧셈, 뺄셈, 곱셈
- 임계값 결정하기 (determining threshold)
- 합병 정렬 원리 이용
'Computers > Algorithm' 카테고리의 다른 글
은행가 알고리즘 (0) | 2016.03.30 |
---|---|
몬테카를로 시뮬레이션 (0) | 2016.03.30 |
ch 3. 동적 프로그래밍 (dynamic programming) (0) | 2016.03.25 |
ch 2. efficiency and analysis (0) | 2016.03.24 |
ch1. definition (0) | 2011.10.27 |