-
이분 탐색(binary search)알고리즘/탐색 2021. 12. 25. 01:05728x90
이분 탐색 : 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법으로 찾으려는 데이터와 중간 위치에 있는
데이터를 반복적으로 비교하여 원하는 결과를 도출해냄.배열 내 데이터들이 정렬되어 있어야 사용할 수 있는 알고리즘이며, 입력 데이터가 많거나, 탐색 범위가 넓은 편.
시간복잡도: O(logN)
확인할 때마다 원소의 개수가 절반씩 줄어듦으로써 시간 복잡도는 logN에 비례하는 시간임.#include <iostream> using namespace std; int binary_search(int arr[], int length, int target) { // 반복적 int start = 0; int end = length-1; int mid; while(start<=end) { mid = (start+end)/2; if(arr[mid] == target) { return mid; } else { if(arr[mid] > target) { end = mid-1; } else { start = mid+1; } } } return -1; } int recursive_search(int arr[], int start, int end, int target) { // 재귀적 int mid = (start+end)/2; if(start>end) { return -1; } else { if(arr[mid]==target) { return mid; } else if(arr[mid]>target) { recursive_search(arr, start, mid-1, target); } else { recursive_search(arr, mid+1, end, target); } } } int main() { int search_arr[10] = {5, 9, 11, 17, 29, 30, 42, 43, 59, 101}; int num, result, size = sizeof(search_arr) / sizeof(search_arr[0]); cin>>num; // result = binary_search(search_arr, size, num); result = recursive_search(search_arr, 0, size-1, num); if(result == -1) { cout<<"이진 탐색 실패"<<endl; } else { cout<<"데이터의 위치는 "<<result+1<<"번째에 있습니다."<<endl; } return 0; }
[이분 탐색으로 해결할 수 없는 경우는?]
삼분 탐색(ternary search)
- 이분 탐색은 단조 증가/감소 문제에만 해당되지만 좀 더 넓은 범위의 문제를 풀때 사용가능함
- 볼록함수에서 극값 혹은 최대/최솟값을 찾을 때 사용
728x90'알고리즘 > 탐색' 카테고리의 다른 글
완전 탐색(Brute Force - with. 백준 일곱난쟁이) (0) 2023.02.19 합집합 찾기(Union-Find) (0) 2021.12.25 깊이 우선 탐색(DFS) (0) 2021.12.25 너비 우선 탐색(BFS) (0) 2021.12.25