이분 탐색
시간 복잡도 : Log(N)
left : 값의 범위중 가장 작은 값
right : 값의 범위중 가장 큰 값
mid : (left + right) / 2
target : 찾으려는 값
ex) 1~100 사이의 5개의 값 1, 11, 21, 31, 99 중에서 31이 있나 찾자!
left : 1, right : 100, mid : 50, target : 31
기본 코드
while (left <= right) { mid = (left + right) / 2; if (arr[mid] == target) return mid; else if (arr[mid] > target) right = mid - 1; else left = mid + 1; }
기본 예제
https://www.acmicpc.net/problem/1920
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #define MAX 200005 #define INF 987654321 #define MOD 31991 #pragma warning(disable:4996) using namespace std; typedef long long ll; typedef pair<int, int> pi; int n, m, tmp, lft, mid, rht; int arr[100005]; int finder(int dest) { while (lft<=rht) { mid = (lft + rht) / 2; if (arr[mid] == dest) return 1; else if (arr[mid] < dest) lft = mid + 1; else rht = mid - 1; } return 0; } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &arr[i]); scanf("%d", &m); sort(arr, arr + n); for (int i = 0; i < m; i++) { lft = 0, rht = n - 1; mid = (lft+rht)/2; scanf("%d", &tmp); int ans=finder(tmp); if (ans) printf("1\n"); else printf("0\n"); } return 0; }
'IT > 알고리즘 및 자료구조' 카테고리의 다른 글
[알고리즘 정리] 이분 매칭 (0) | 2018.09.30 |
---|---|
[알고리즘 정리] 세그먼트 트리 (0) | 2018.09.17 |
[알고리즘 정리] 그라함 알고리즘(Graham’s scan) 알고리즘 (0) | 2018.08.26 |
[알고리즘] 구조체를 이용한 행렬의 곱 구현 (0) | 2018.08.11 |
[알고리즘 정리] 최장 증가 수열(LIS,Largest Increasing Sequence) 알고리즘 (2) | 2018.07.16 |