이진 탐색(Binary Search)
정렬된 배열에서 특정 값을 찾는 알고리즘입니다.(필수조건!)
특징
- 반복 또는 재귀적 구현: 이진 탐색은 반복문이나 재귀 함수를 사용하여 구현할 수 있습니다.
- 정렬된 배열에서 사용: 이진 탐색은 정렬된 배열에서만 사용할 수 있습니다. 배열의 중간 값을 기준으로 탐색 범위를 좁혀가며 값을 찾습니다.
- 시간 복잡도: 이진 탐색의 시간 복잡도는 O(log n)입니다. 배열을 반으로 분할하면서 탐색 범위를 절반으로 줄여나가기 때문에 탐색 시간이 로그 시간에 비례합니다.
알고리즘 동작 방식
- 탐색 범위의 시작 인덱스와 끝 인덱스를 설정합니다.
- 탐색 범위의 중간 인덱스를 찾습니다.
- 중간 값과 찾고자 하는 값을 비교합니다.
- 중간 값이 찾고자 하는 값과 일치하면 탐색 성공입니다.
- 중간 값이 찾고자 하는 값보다 작으면 탐색 범위를 오른쪽 절반으로 좁힙니다.
- 중간 값이 찾고자 하는 값보다 크면 탐색 범위를 왼쪽 절반으로 좁힙니다.
- 탐색 범위를 좁혀가며 위의 과정을 반복합니다.
- 탐색 범위가 비어있을 때까지 반복합니다. 비어있을 경우, 찾고자 하는 값은 배열에 존재하지 않는 것입니다.
장점
- 시간 복잡도가 로그 시간에 비례하여 매우 효율적입니다. 크기가 큰 배열에서도 빠른 탐색이 가능합니다.
- 정렬된 배열에서만 사용 가능하므로, 정렬된 데이터에서의 탐색에 유용합니다.
단점
- 배열이 정렬되어 있어야만 사용할 수 있습니다. 정렬되지 않은 배열에서는 사용할 수 없습니다.
- 배열이 동적으로 변경되는 경우에는 이진 탐색을 사용할 수 없습니다.
- 추가적인 메모리 공간을 사용하지 않으므로, 이진 탐색 자체는 제자리 알고리즘이지만, 재귀적 구현 시에는 스택 메모리를 사용할 수 있습니다.
요약
이진 탐색은 정렬된 배열에서 매우 효율적으로 동작하는 탐색 알고리즘입니다.
시간 복잡도가 로그 시간에 비례하므로 크기가 큰 배열에서도 빠른 탐색이 가능합니다.
그러나 정렬된 배열에서만 사용 가능하고, 배열이 동적으로 변경되는 경우에는 사용할 수 없습니다.
void DoBinarySearch()
{
vector<int> arr;
arr.assign(MAX_SIZE, int());
int count = 0;
for (int& num : arr)
num = count++;
int find = rand() % MAX_SIZE;
cout << "Find " << find << endl;
cout << "Index " << BinarySearch(arr, find);
cout << endl;
Pause;
return;
}
int BinarySearch(vector<int> arr, int find)
{
int left = 0;
int right = arr.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == find) return mid;
else if (arr[mid] < find) left = mid + 1;
else right = mid - 1;
}
return -1;
}
'알고리즘' 카테고리의 다른 글
[알고리즘] C++ 손코딩 예제 정리 (0) | 2024.05.20 |
---|---|
[알고리즘] 시간복잡도 순서(Big O) (0) | 2024.05.16 |
[알고리즘] 병합 정렬(Merge Sort) (0) | 2023.07.16 |
[알고리즘] 퀵 정렬(Quick Sort) (0) | 2023.07.16 |
[알고리즘] 버블 정렬(Bubble Sort) (0) | 2023.07.16 |
댓글