기초/알고리즘
[알고리즘] 이진 탐색(Binary Search)
올리버
2021. 12. 2. 11:35
이진 탐색(Binary Search)란?
오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘이다.
배열의 중간 값을 임의의 값 X로 선택하여, 찾고자 하는 값보다 크면 우측 데이터를 대상으로,
작으면 좌측 데이터를 대상으로 해당 값을 찾을 때 까지 반복하여 검색한다.
장점
- 목표 값을 찾을 확률이 두배가 되어 속도가 빠르다.
단점
- 정렬된 리스트에만 사용할 수 있다.
이진 탐색 과정
1. 정렬된 리스트를 준비한다.
2. 중간 지점을 찾는다. (left + right) / 2
3. 중간 지점의 값과 목표하는 값을 비교한다.
3.1 중간 지점의 값 < 목표하는 값의 경우
- 검색 범위를 중간 지점의 우측으로 변경한다.
3.2 중간 지점의 값 > 목표하는 값의 경우
- 검색 범위를 중간 지점의 좌측으로 변경한다.
4. 목표하는 값을 찾을 때 까지 반복한다.
알고리즘 구현
반복문 방식
#include <iostream>
#include <vector>
using namespace std;
/*
* 반복문 방식 이진 탐색
*/
int binarySearch(vector<int>& arr, int target){
int left,right,mid;
left = 0;
right = arr.size() -1;
while(left <= right){
mid = (left + right) / 2;
if(target < arr[mid])
right = mid - 1;
else if(target > arr[mid])
left = mid + 1;
else
return mid;
}
return -1;
}
int main(){
//정렬된 리스트
vector<int> arr = {1,3,4,5,6,7,8,10,15,46,54,66,100};
int targetValue = 54;
int index = binarySearch(arr,targetValue);
cout << targetValue << " 의 위치 : " << index << endl;
return 0;
}
재귀 방식
#include <iostream>
#include <vector>
using namespace std;
/*
* 재귀 방식 이진 탐색
*/
int binarySearch(vector<int>& arr,int left,int right, int target){
int mid = (left + right) / 2;
if(arr[mid] == target)
return mid;
else if(arr[mid] < target)
return binarySearch(arr,mid + 1,right,target);
else if(arr[mid] > target)
return binarySearch(arr,left,mid - 1,target);
return -1;
}
int main(){
//정렬된 리스트
vector<int> arr = {1,3,4,5,6,7,8,10,15,46,54,66,100};
int targetValue = 54;
int left = 0;
int right = arr.size() - 1;
int index = binarySearch(arr,left,right,targetValue);
cout << targetValue << " 의 위치 : " << index << endl;
return 0;
}
시간 복잡도
- 절반씩 검색하여 목표하는 값을 찾아나간다.
- 평균 시간 복잡도 : O(log2 N)