CS/알고리즘

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

영벨롭 2022. 5. 4. 14:27

[ 선형 탐색 Linear Search ]

 

 선형 탐색은 배열의 첫 번째 원소부터 차례대로 전체 원소를 방문하면서 해당 원소가 검색하려는 원소와 같은지 확인하는 방법입니다. 

 

 이 방법의 장점은 입력 시퀀스의 정렬 여부와 상관없이 항상 잘 동작한다는 점입니다. 

 

 하지만 이 방법은 효율적이지 않으며, 주어진 배열이 정렬되어 있어도 그 점을 전혀 활용하지 못합니다. 

 

 선형 탐색 알고리즘의 시간 복잡도는 O(N)입니다. 

 

int linear_search(int N, vector<int> arr) {
	for(int i = 0; i < arr.size(); i++){
    		if(arr[i] == N)
        		return i;
    	}
    return -1;
}

 

 

 

 

[ 이진 탐색 Binary Search ]

 

 선형 탐색과 달리 이진 탐색은 정렬된 배열에서만 동작하는 알고리즘으로, 분할 정복 (divide & conquer) 알고리즘이라고 할 수 있습니다. 

 

 배열의 중간 원소와 검색하려는 원소를 비교하여 배열을 분할함으로써 검색을 수행합니다. 

 

 이진 탐색의 시간 복잡도는 O(log N) 입니다. 

 

 

int binary_search (vector<int> arr, int s, int e, int x) {
	if (s == e)
    		return (arr[s] == x) ? s : -1;

	int mid = (s + e) / 2;
    	if (x == arr[mid])
    		return mid;
    	else if (arr[mid] > x)
    		return binary_search(arr, s, mid-1, x);
    	else 
    		return binary_search(arr, mid+1, e, x);
}

 

예시)

 

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

int x = 2

 

 

1. 현재 arr의 가운데 원소와 x를 비교한다.

 

int mid = (0 + 9) / 2 = 4

arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] arr[6] arr[7] arr[8] arr[9]
1 2 3 4 5 6 7 8 9 10

 

 2. 만약 두 원소가 같다면 x를 찾은 것이므로 검색을 중단한다. 

 

 3. 그렇지 않다면 다음 두 규칙에 따라 검색을 진행한다. 

  • 만약 중간원소가 x보다 크다면 중간원소보다 작은 원소들에 대해 검색 진행
  • 만약 중간원소가 x보다 작다면 중간원소보다 큰 원소들에 대해 검색 진행

int mid = (0 + 3) / 2 = 1

arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] arr[6] arr[7] arr[8] arr[9]
1 2 3 4 5 6 7 8 9 10

 

 

 

반응형