이진 탐색
매 비교마다 남은 범위의 절반을 버립니다.
이진 탐색이란?
매 비교마다 남은 범위의 절반을 버립니다.
정렬된 데이터를 로그 시간에 탐색합니다.
중요한 점
- 빈 입력, 한 요소, 중복, 정렬된 입력을 테스트하세요.
- 정확성과 최적화를 분리하세요.
- 프로덕션에서는 standard library를 우선하세요.
이진 탐색 시각화
O(log n)재생 또는 한 단계를 눌러 비교와 데이터 이동 과정을 확인하세요.
C와 C++ 코드 예제
C
main.c
#include <stdio.h>
int search(const int *values, int size, int target) {
int low = 0;
int high = size - 1;
while (low <= high) {
int middle = low + (high - low) / 2;
if (values[middle] == target) return middle;
if (values[middle] < target) low = middle + 1;
else high = middle - 1;
}
return -1;
}
int main(void) {
int values[] = {3, 7, 11, 16, 23, 28};
printf("index=%d\n", search(values, 6, 23));
}
index=4
C++
main.cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector values{3, 7, 11, 16, 23, 28};
auto match = std::lower_bound(values.begin(), values.end(), 23);
std::cout << "index="
<< std::distance(values.begin(), match) << '\n';
}
index=4
C와 C++ 비교
입력은 sorted여야 합니다. C loop와 std::lower_bound는 random-access range에서 O(log n)입니다.
C
Loop, pointer, length와 buffer가 명시적입니다.
C++
Iterator와 algorithm이 연산과 저장 방식을 분리합니다.
연습 문제
두 버전을 실행하고 수정하여 각 언어의 보장을 관찰하세요.
- 각 비교를 직접 추적하세요.
- 중복과 극값을 테스트하세요.
- Standard library와 benchmark하세요.