728x90
◇ 설명
: 정렬된 데이터 집합을 이분화하면서 탐색하는 방법
① 오름차순으로 배열 정렬
② 중간 값( 평균 값 )부터 찾음 ( 찾으려는 값과 비교 )
③ 찾으려는 값이 중간값보다 크면 아래로 내려가고, 작으면 위로 올라감
- 시간복잡도가 일반 순차 탐색보다 훨씬 빠름
┌ 전체 탐색 : O(N)
└ 이분 탐색 : O(logN)
◇ 코드
ex) 정렬된 배열에서 찾고자 하는 값의 인덱스 구하기
// 재귀
public static int binary_search_idx( int a[], int value, int low, int high ) {
if( high <= low )
return -1;
int mid = ( low + high ) / 2;
if( a[mid] > value )
return binary_search_idx( a, value, low, mid - 1 );
else if( a[mid] < value )
return binary_search_idx( a, value, mid + 1, high );
else
return mid;
}
// 반복문
public static int binary_search_idx( int a[], int value ) {
int low = 0, high = a.length - 1, mid;
while( low <= high ) {
mid = ( low + high ) / 2;
if( a[mid] > value )
high = mid - 1;
else if( a[mid] < value )
low = mid + 1;
else
return mid;
}
return -1;
}
// low, left, start
// high, right, end
ex) lower bound, upper bound 구하기
public int lower_bound( int k, int a[] ) {
// 배열 a에서 k값이 처음으로 나타나는 인덱스
int start = 0, end = a.length - 1, mid;
while( start < end ) {
mid = (start + end) / 2;
if( a[mid] >= k )
end = mid;
else start = mid + 1;
}
return end;
}
public int upper_bound( int k, int a[] ) {
// 배열 a에서 k보다 큰 값이 처음으로 나타나는 인덱스
int start = 0, end = a.length - 1, mid;
while( start < end ) {
mid = (start + end) / 2;
if( a[mid] > k )
end = mid;
else start = mid + 1;
}
return end;
}
반응형
'컴퓨터 공학 ( Computer Science ) > 알고리즘 ( Algorithm )' 카테고리의 다른 글
[알고리즘] 그래프 최단 경로 ( Shortest Path ) - 다익스트라, 벨만-포드, 플로이드-워샬, 사이클이 없는 유향 그래프( DAG ) (0) | 2021.03.20 |
---|---|
[알고리즘] 그래프 탐색 ( Graph Search ) - 깊이 우선(DFS), 너비 우선(BFS ) (0) | 2021.03.20 |
[알고리즘 기법] 분기한정법 ( Branch and Bound ) (0) | 2021.03.20 |
[알고리즘 기법] 백트래킹 ( 되추적 방법 ) ( Backtracking ) (0) | 2021.03.20 |
[알고리즘 기법] 분할정복법 ( Divide and Conquer ) (0) | 2021.03.20 |