본문 바로가기
Algorithm/이론

[알고리즘] 이분 탐색

by 우툴 2016. 4. 6.
728x90

이분 탐색

 탐색 기법중에 하나로 원하는 탐색범위를 두 부분으로 분할해서 찾는 방식입니다. 그렇기에 원래의 전부를 탐색하는 탐색 속도에 비해 빠릅니다. 이분 탐색을 하는 방법은 left , right , mid 값으로 탐색하는 것입니다. mid의 값은 (left + right)/2 으로 잡아주고 우리가 검색하고자 하는 값과 mid 값을 비교합니다. 순서로 말하자면

1.이분 탐색을 하고자 할 때 이미 정렬이 되어있어야 합니다.

2. left, right로 미드값을 잡아줍니다.

3. mid 값과 구하고자 하는 값을 비교 합니다.

4. 비교할시 mid 값보다 구하고자 하는 값이 높으면 left를 mid+1로 만들어주고 낮으면 right를 mid-1로 만들어 줍니다. 

5. left > right 가 될때까지 1~3번을 반복해서 구하고자 하는 값을 찾습니다.

 이렇게 검색을 하면 전체를 검색하는 경우인 시간복잡도가 O( n ) 인거에 비해서 O( log(n) ) 으로 적다고 합니다. 이분 탐색의 예는 아래 그림으로 보여드리겠습니다.

코드

 정해진 배열에서 우리가 찾고자 하는 수가 배열의 몇번째에 있는지 탐색하는 간략화된 코드입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
 
int main(void){
 
    int findN;
    int result = 0;
    //처음int는 다음 정점 마지막 int 값어치
 
    int A[10= { 12345678915 };
 
    scanf("%d", &findN);
    int left = 0, right =  9;
 
 
    while (left <= right){
 
        int mid = (left + right) / 2;
        if (A[mid] > findN)
            right = mid - 1;
        else if (A[mid] < findN)
            left = mid + 1;
        else
        {
            result = mid;
            break;
        }
 
    }
 
    printf("%d\n", result);
 
    return 0;
}
cs


728x90

'Algorithm > 이론' 카테고리의 다른 글

[STL] sort 사용하기  (0) 2016.04.05
[STL] vector 사용하기  (0) 2016.04.04
[STL] pair 사용하기  (1) 2016.04.04
[조합] nCr 쉽게 구하기. (수정 20190604)  (5) 2016.04.03
[그래프의 표현] 인접 리스트  (0) 2016.04.01

댓글