본문 바로가기

JAVA

[JAVA] 배열 이진탐색/이분검색(Binary Search) 알고리즘

반응형
이진탐색 알고리즘
오름차순으로 정렬되어 있는 리스트에서 특정한 값을 찾을 때, 처음 중간의 값을 임의의 값으로 선택하여, 그 값과 찾고자 하는 값의 크고 작음을 비교하는 방식이다.

 

이진탐색 알고리즘 조건

★ 모든 원소는 정렬되어야 한다. ★

 

이진탐색 알고리즘의 장단점 

장점 :  검색이 반복될 때마다 목표값을 찾을 확률은 두 배가 되므로 속도가 빠르다.

단점 :  정렬된 리스트에서만 사용할 수 있다

 

이진 탐색의 구현

1. 탐색의 대상이 되는 자료들이 array[low] 에서부터 array[high]에 들어있다고 가정하자. (정렬되어 있어야 함)

즉 어떤 시점에서 탐색되어야 할 범위는 low에서 high 까지가 된다.

맨 처음 low에는 0번 인덱스의 값, high에는 n-1번 인덱스의 값이 들어갈 것이다.

 

2. low와 high값에 의거해  중간값 mid 값은 (low + high) / 2이다.

즉, array[low] ~ array[high] 까지의 탐색은

array[low] ~ array[middle-1] +  array[middle+1] + array[high]까지의 탐색이 된다.

 

3. array[mid] 값과 구하고자 하는 key값을 비교한다.

3-1. key > mid :  구하고자 하는 값이 중간값보다 높다면 low를 mid +1로 만들어 줌 (왼쪽 반을 버림)

3-2. key < mid : 구하고자하는 값이 중간값 보다 낮다면 high를 mid-1로 만들어 줌 (오른쪽 반을 버림)

3-3. key == mid : 구하고자 하는 값을 찾음 

 

4. low > high 되는 교차(CROSS)상황이 발생한다면 , 해당되는 데이터가 없으므로 탐색이 종료된다. 

 

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package class04;
 
import java.util.Scanner;
 
public class Test06 {
    public static void main(String[] args) {
 
        // [이진탐색(이분검색)]
        // -> 탐색할 대상 배열이 "정렬"되어있어야만 합니다. 
 
        int[] data = {1,40,50,55,60,70,81,92,94,100};
 
        Scanner sc = new Scanner(System.in);        
 
        while(true) {
            boolean flag= true// 어떠한 행위가 잘 되었는지를 체크하는 변수 
            // T / F 밖에 없다! 
            
            System.out.print("검색 : ");
            int num = sc.nextInt();
 
            int L=0;
            int H=data.length-1;
 
            while (true) {
 
                int M = (L+H)/2// 
 
                if (data[M] == num) { // 종료조건
                    System.out.println("["+M+"]에"+num+"가 존재합니다!");
                    break;
                }
                else if (data[M] > num) {// DOWN 상황
                    H=M-1;
                }else { // UP 상황
                    L=M+1;
                }
                if (L>H) { // 교차(cross) 상황
                    System.out.println("찾는 데이터가 없습니다.");
                    flag=false// 만약, 찾으려는 데이터가 없다면 F로 값을 변경
                    break;
                }
 
            }
            if (flag) {//flag변수가 T상태를 유지하면, 멈출수있다! 
//                내가 원하는 데이터를 찾은 상황 -> T
//                내가 찾으려는 데이터가 없는 상황 -> F
                break;
            }
        }
    }
}
cs

 

 

 

반응형