알고리즘/탐색

이분 탐색(binary search)

Dero Lee 2021. 12. 25. 01:05
728x90

 

이분 탐색 : 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법으로 찾으려는 데이터와 중간 위치에 있는
데이터를 반복적으로 비교하여 원하는 결과를 도출해냄.

 

 

 

배열 내 데이터들이 정렬되어 있어야 사용할 수 있는 알고리즘이며, 입력 데이터가 많거나, 탐색 범위가 넓은 편.

시간복잡도: O(logN)
확인할 때마다 원소의 개수가 절반씩 줄어듦으로써 시간 복잡도는 logN에 비례하는 시간임.

 

#include <iostream>

using namespace std;

int binary_search(int arr[], int length, int target) { // 반복적 
	int start = 0;
	int end = length-1;
	int mid;
	
	while(start<=end) {
		mid = (start+end)/2;
		if(arr[mid] == target) {
			return mid;
		} else {
			if(arr[mid] > target) {
				end = mid-1;
			} else {
				start = mid+1;
			}
		}
	}
	return -1;
}

int recursive_search(int arr[], int start, int end, int target) { // 재귀적 
	int mid = (start+end)/2;
    
	if(start>end) {
		return -1;
	}
    
	else {
		if(arr[mid]==target) {
			return mid;
		} else if(arr[mid]>target) {
			recursive_search(arr, start, mid-1, target);
		} else {
			recursive_search(arr, mid+1, end, target);	
		}
	}
} 

int main()
{							
	int search_arr[10] = {5, 9, 11, 17, 29, 30, 42, 43, 59, 101};
	int num, result, size = sizeof(search_arr) / sizeof(search_arr[0]);
	cin>>num;
	
	// result = binary_search(search_arr, size, num);
	result = recursive_search(search_arr, 0, size-1, num);
	if(result == -1) {
		cout<<"이진 탐색 실패"<<endl;
	} else {
		cout<<"데이터의 위치는 "<<result+1<<"번째에 있습니다."<<endl;
	}
	return 0;
}

 

[이분 탐색으로 해결할 수 없는 경우는?]

 

삼분 탐색(ternary search)

  • 이분 탐색은 단조 증가/감소 문제에만 해당되지만 좀 더 넓은 범위의 문제를 풀때 사용가능함
  • 볼록함수에서 극값 혹은 최대/최솟값을 찾을 때 사용
728x90