728x90
[Algorithm] Binary Search (이분 탐색) 이란?
Binary Search(이분 탐색) 이란?
| 정렬된 배열에서 특정한 값을 찾는 검색 알고리즘 |
- `중간 지점`의 값을 확인하여 찾고자 하는 값과 비교
- 만약 다르다면, 검색 범위를 1/2로 축소
- 배열이 미리 `정렬` 되어있어야 한다.
Binary Search - 장점
- 선형 탐색(linear search)에 비해 매우 빠른 검색 시간 제공
- 시간 복잡도는 `O(log n)` 이다.
Binary Search - 구현 방법
- 배열의 가장 낮은 인덱스를 `low`로, 가장 높은 인덱스를 `high`로 설정합니다.
- `low`가 `high`보다 작거나 같은 동안 반복합니다:
- 중간 지점 `mid`를 (`low` + `high`) / 2로 계산합니다.
- 중간 지점의 값이 찾고자 하는 값과 같다면, 위치를 반환합니다.
- 중간 지점의 값이 찾고자 하는 값보다 크다면, `high`를 `mid` - 1로 업데이트합니다.
- 중간 지점의 값이 찾고자 하는 값보다 작다면, `low`를 `mid` + 1로 업데이트합니다.
- 찾고자 하는 값이 배열에 없다면, 검색을 종료합니다.
Binary Search 예시 (C++)
#include <iostream>
#include <vector>
using namespace std;
int binarySearch(vector<int>& nums, int target) {
int low = 0, high = nums.size() - 1;
while (low <= high) {
int mid = low + (high - low) / 2; // 오버플로우를 방지하기 위한 계산 방식
if (nums[mid] == target) return mid; // 타겟을 찾은 경우
else if (nums[mid] < target) low = mid + 1; // 타겟이 중간값보다 큰 경우
else high = mid - 1; // 타겟이 중간값보다 작은 경우
}
return -1; // 타겟을 찾지 못한 경우
}
int main() {
vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int target = 4;
int result = binarySearch(nums, target);
if (result != -1) cout << "Element found at index " << result << endl;
else cout << "Element not found in the array" << endl;
return 0;
}
정렬된 배열 `nums` 에서 찾고자 하는 값 `target`을 탐색하고자 한다.
| 1. 배열의 가장 낮은 인덱스를 low 로, 가장 높은 인덱스를 high 로 설정 |
- `binarySearch` 함수에서 각각 변수로 설정한다.
| 2. low가 high 보다 작거나 같은 동안 반복합니다 |
- `while(low <= high)` 문 안에서 계속 반복한다.
- 중간 지점 `mid`를 (`low` + `high`) / 2로 계산합니다.
- 중간 지점의 값이 찾고자 하는 값과 같다면, 위치를 반환합니다.
- 중간 지점의 값이 찾고자 하는 값보다 크다면, `high`를 `mid` - 1로 업데이트합니다.
- 중간 지점의 값이 찾고자 하는 값보다 작다면, `low`를 `mid` + 1로 업데이트합니다.
| 3. 찾고자 하는 값이 배열에 없다면, 검색을 종료합니다. |
- "Element not found in the array" 를 출력한다.
728x90
반응형
'Algorithm' 카테고리의 다른 글
[Programmers] Javascript 해시 - 완주하지 못한 선수 (0) | 2023.03.23 |
---|