알고리즘

이진 탐색

unhyepnhj 2024. 11. 18. 20:01

이진 탐색(binary search): 정렬된 배열에서 탐색 범위를 절반으로 줄여 가며 목표 값을 탐색

 

정렬된 배열 arr에 대하여 탐색할 범위의 양 끝 인덱스를 각각 low와 high라 하고, 이 둘의 중앙값인 \(mid=(low+high)/2\)를 설정하여 찾고자 하는 값 value와 mid를 비교한다. value=mid이면 목표 값을 발견했으므로 탐색을 종료하고, value<mid라면 high를 mid로 갱신해 mid의 왼쪽 sub-array에 대해 다시 탐색을, value>mid라면 low를 mid로 갱신해 mid의 오른쪽 sub-array에 대해 탐색을 진행한다.

 

이진 탐색 알고리즘

N개의 입력에 대하여 탐색 범위가 N → N/2 → N/4 → N/8 ... 1으로 줄어드므로 \(O(logN)\)의 시간복잡도를 가진다.

 

이진 탐색 구현 - 순환

int binary_search_recur(int key, int lot, int high){
	int mid;
    
    if (low <= high){
    	mid = (low + high)/2;
        
        if (key == list[mid]){
        	return mid;	//탐색 성공
        }
        else if (key < list[mid]){
        	return binary_search_recur(key, low, mid-1);	//왼쪽 부분리스트 탐색
        }
        else {
        	return binary_search_recur(key, mid+1, high);	//오른쪽 부분리스트 탐색
        }
    }
    return -1;	//탐색 실패
}

 

이진 탐색 구현 - 반복

int binary_search_iter(int key, int low, int high){
	int mid;
    
    while(low <= high){
    	mid = (low + high)/2;
        
        if (key == list[mid]){
        	return mid;
        }
        else if (key > list[mid]){
        	low = mid + 1;	//오른쪽 부분리스트로 범위 변경
        }
        else {
        	high = mid - 1;	//왼쪽 부분리스트로 범위 변경
        }
        return -1;	//탐색 실패
    }
}

시간복잡도 자체는 순환 호출로 구현한 것과 동일하나(O(logN)) 함수 호출을 이용한 context switching, push/pop 과정이 없으므로 순환 호출보다 빠르다.