-
[알고리즘] 탐색(2) - 이진 탐색CS/알고리즘 2024. 12. 5. 02:29
이진 탐색(Binary Search)
이진 탐색
- 정렬된 데이터에서 사용할 수 있다.
- 탐색 범위를 절반씩 줄여가면서 원하는 데이터를 찾는 방식이다.
탐색 과정
- 데이터 중앙에 있는 요소 선택
- 선택된 중앙 요소가 목표값인지 확인
- 목표값보다 작으면 왼쪽 부분에서, 목표값보다 크면 오른쪽 부분에서 이진 탐색을 한다.
- 목표값을 찾을 때까지 1~3번을 반복
이진탐색의 성능
- 데이터 크기: n
- 탐색 반복 횟수: x
- 이진 탐색은 탐색을 반복할 수록 데이터 크기가 절반(1/2)씩 줄어든다.
$$데이터\;크기 * (1/2)^{탐색\;반복\;횟수} = 데이터\;범위$$
최악의 경우
- 데이터 범위가 1까지 오는 상황
$$n * (1/2)^x = 1$$
$$=> n=2^x$$
$$=> x=log_2{n}$$
따라서 시간 복잡도는 O(logN)
[코드 - C]
#include <stdio.h> #include <stdlib.h> int binarySearch(int data[], int size, int target) { int left, mid, right; left = 0; right = size - 1; while (left <= right) { mid = (left + right) / 2; if (target == data[mid]) return mid; else if (target > data[mid]) { left = mid + 1; } else { right = mid - 1; } } return -1; } int Compare(const void* a, const void* b) { // a가 크면 양수 // b가 크면 음수 // 같으면 0 return (*(int*)a - *(int*)b); } void printResult(int data[], int length) { for (int i = 0; i < length; i++) { printf("%d ", data[i]); } printf("\n"); } int main(void) { int data[] = {54, 74, 2939, 39548, 109, 284, 394, 585, 3847, 728, 11, 838, 999, 294}; int length = sizeof(data) / sizeof(data[0]); int target = 2939; printf("목표값: %d\n", target); printf("before sort\n"); printResult(data, length); // 퀵 정렬 qsort((void*)data, length, sizeof(int), Compare); printf("after sort\n"); printResult(data, length); // 탐색 int found = binarySearch(data, length, target); if (found != -1) { printf("찾은 인덱스:%d\n", found); printf("찾은 값:%d\n", data[found]); } else { printf("탐색 실패\n"); } return 0; }
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] 정렬(4) - 퀵 정렬 (0) 2024.12.02 [알고리즘] 정렬(3) - 선택 정렬 (3) 2024.11.24 [알고리즘] 정렬(2) - 삽입 정렬 (0) 2024.11.23 [알고리즘] 정렬(1) - 버블 정렬 (0) 2024.11.23