알고리즘

[알고리즘] 이진 탐색(Binary Search)이란

얼복무 2024. 10. 22. 20:00

1. 이진 탐색(Binary Search)이란?

이진 탐색은 이분 탐색이라고도 합니다. 순차적 탐색, 선형 탐색(Linear Search)보다 속도가 빠릅니다.

순차적 탐색은 0부터 9까지 숫자가 있다면 0, 1, 2, 3, 4...9까지 총 10번의 탐색을 실행합니다.
그에 비해 이진 탐색은 이분(二分)이라는 말처럼 반으로 나누어서 탐색을 합니다.

이진 탐색에서 찾아야 하는 숫자가 9라고 했을 때 0부터 9까지 있다면 중간값부터 탐색을 하게 됩니다.
0과 9의 중간값인 4를 찾고, 목표인 9가 중간값인 4보다 크기 때문에 5와 9의 중간값을 다시 찾습니다.
다음 중간값인 7과 9를 비교해보면 9가 더 크고, 마지막으로 다음 중간값 8보다 9가 크므로 9를 찾아 탐색을 종료합니다.

 

0 1 2 3 4 5 6 7 8 9

 

0 1 2 3 4 5 6 7 8 9

 

0 1 2 3 4 5 6 7 8 9

 

0 1 2 3 4 5 6 7 8 9

 

 

 

//반복문으로 구현

public int binarySearch(int[] arr, int n) {
    int first = 0;
    int last = n-1; //n은 전체 길이
    int mid = -1;

    while(first <= last) {
        mid = (first+last)/2;

        if(target == arr[mid])
            return mid;
        else if(target < arr[mid])
            last = mid-1;
        else
        	first = mid+1;
    }
    
    return mid;
}

 

//재귀로 구현

public int binarySearch(int[] arr, int target, int first, int last) {
	int mid = (first + last) / 2;
        
    if (target == arr[mid])
        return mid;
	else if (target < arr[mid])
        return binarySearch(arr, n, left, mid-1);
	else if (target > arr[mid]) 
        return binarySearch(arr, n, mid+1, last);	
    else 
    	return -1; //찾는 타겟이 없을 때
}

 

 

 

2. 이진 탐색의 시간복잡도

순차적 탐색: 최악의 경우 n을 전부 탐색해야 하므로 O(n)

이진 탐색: 중간값에 따라 n/2를 반복하므로 O(log2)

 

데이터 수가 적은 게 아니라면 웬만한 경우에서는 이진 탐색의 속도가 더 빠릅니다.