- 설계 전략
- 분할 (Divide) : 해결할 문제를 여러 개의 작은 부분으로 나눈다.
- 정복 (Conquer) : 나눈 작은 문제를 각각 해결한다.
- 통합 (Combine) : (필요하다면) 해결된 해답을 모은다.
반복(Iterative) 알고리즘 시간복잡도 : O(n)
분할정복 알고리즘 시간복잡도 : O(log2n)
long exp(long x, long y){
long r = exp(x,y/2);
long res = r*r;
if(y==1) return x;
if(y%2==1) res *= x; //홀수일 때
return res;
}
- 자료의 가운데에 있는 항목의 키 값과 비교하여 다음 검색의 위치를 결정하고 검색을 계속 진행하는 방법
- 목적 키를 찾을 때까지 이진 검색을 순환적으로 반복 수행함으로써 검색 범위를 반으로 줄여가면서 보다 빠르게 검색을 수행함
이진 검색을 하기 위해서는 자료가 정렬된 상태여야 한다.
시간복잡도 : O(log2n)
검색 과정
- 자료의 중앙에 있는 원소를 고른다.
- 중앙 원소의 값과 찾고자 하는 목표 값을 비교한다.
- 중앙 원소의 값과 찾고자 하는 목표 값이 일치하면 탐색을 끝낸다.
- 목표 값이 중앙 원소의 값보다 작으면 자료의 왼쪽 반에 대해서 새로 검색을 수행하고,
크다면 자료의 오른쪽 반에 대해서 새로 검색을 수행한다.- 찾고자 하는 값을 찾을 때까지 위의 과정을 반복한다.
static int binarySearch(int[] arr, int key) {
//arr은 정렬된 오름차순배열이어야 한다.
int start = 0, end = arr.length-1;
while(start<=end) {
int mid = (start+end) / 2; //중간위치
if(arr[mid] == key) {
return mid;
} else if( arr[mid]<key) {
start = mid +1;
} else {
emd = mid-1;
}
//못찾았다면
return -1;
}
}