N)을 비교:O(N))보다 훨씬 빠르게 작동.O(N log N)).std::vector)는 중간 삽입/삭제 시 O(N) 시간이 소요.std::map 또는 std::set과 같은 동적 데이터 구조가 더 적합.#include <iostream>
#include <vector>
std::vector<int> numbers;
void BinarySearch(int N) {
int left = 0;
int right = numbers.size() - 1;
while (left <= right) {
std::cout << "탐색 범위: " << left << " ~ " << right << std::endl;
int mid = (left + right) / 2; // 중간값 계산
if (N < numbers[mid]) {
std::cout << N << " < " << numbers[mid] << std::endl;
right = mid - 1; // 왼쪽 절반 탐색
} else if (N > numbers[mid]) {
std::cout << N << " > " << numbers[mid] << std::endl;
left = mid + 1; // 오른쪽 절반 탐색
} else {
std::cout << "찾았음: " << numbers[mid] << std::endl;
return;
}
}
std::cout << "값을 찾지 못함." << std::endl;
}
main 함수int main() {
numbers = {1, 8, 15, 23, 32, 44, 56, 63, 81, 91}; // 정렬된 벡터
BinarySearch(81); // 81을 찾는 탐색 실행
return 0;
}
numbers = {1, 8, 15, 23, 32, 44, 56, 63, 81, 91};
numbers는 오름차순으로 정렬되어 있습니다.int left = 0;
int right = numbers.size() - 1;
left: 탐색 범위의 시작 인덱스.right: 탐색 범위의 끝 인덱스. 초기값은 벡터 크기에서 1을 뺀 값.int mid = (left + right) / 2;
(left + right) / 2.찾는 값이 중간값보다 작은 경우:
if (N < numbers[mid]) {
right = mid - 1;
}
찾는 값이 중간값보다 큰 경우:
else if (N > numbers[mid]) {
left = mid + 1;
}
찾는 값을 발견한 경우:
else {
std::cout << "찾았음: " << numbers[mid] << std::endl;
return;
}
찾는 값이 없는 경우:
탐색 범위: 0 ~ 9
81 > 32
탐색 범위: 5 ~ 9
81 > 63
탐색 범위: 8 ~ 9
81 == 81
찾았음: 81
재귀적 이진 탐색:
int RecursiveBinarySearch(const std::vector<int>& arr, int left, int right, int target) {
if (left > right) return -1;
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] > target) return RecursiveBinarySearch(arr, left, mid - 1, target);
else return RecursiveBinarySearch(arr, mid + 1, right, target);
}
중복 값 처리:
| 특징 | 이진 탐색 | 선형 탐색 |
|---|---|---|
| 시간 복잡도 | O(log N) | O(N) |
| 데이터 정렬 여부 | 정렬 필수 | 정렬 불필요 |
| 탐색 속도 | 빠름 | 느림 |
| 삽입/삭제 효율성 | 비효율적 | 효율적 |