본문 바로가기

개발/algorithm

[java][algorithm]검색 - 선형검색, 이진검색(binarySearch)

반응형

선형검색

앞부터 순서대로 검색 하는 방법

 

 
package javaStudy;
import java.util.Scanner;
public class ch3_2 {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        System.out.print("배열 수 :  ");
        int num = stdIn.nextInt();
        
        int[] x = new int[num];
        
        for (int i = 0; i < x.length; i++) {
            System.out.print("x[i] : ");
            x[i] = stdIn.nextInt();
        }
        
        System.out.print("검색할 값 : ");
        int key = stdIn.nextInt();
        
        int res = seqSearch(x, num, key);
        if(res!=-1) {
            System.out.println(key+ "값은 " + (res+1) + "번째에 있습니다.");
        }else {
            System.out.println("찾는 값이 없습니다.");
        }
    }
    
    //선형검색
    public static int seqSearch(int[] a, int n, int key) {
        for (int i = 0; i < a.length; i++) {
            if(a[i]==key) {
                return i;
            }
        }
        return -1;
    }
}

 

 

 

 

이진검색

이진검색은 요소가 오름차순 또는 내림차순으로 정렬된 배열에서 검색하는 알고리즘입니다.

 

- 오름차순으로 입력된 배열 a[9]에서 데이터 39를 이진검색을 이용하여 검색해봅시다.

a[0] = 5  a[1] = 7  a[2] = 15  a[3] = 28  a[4] = 29  a[5] = 31  a[6] = 39  a[7] = 58  a[8] = 68  a[9] = 70 

 

1. 배열의 중앙에 위치한 a[4] = 29를 찾습니다. 검색하려는 값(39)이 29보다 크기 때문에 a[4]보다 큰 배열로 검색 대상을 좁힙니다.

a[0] = 5  a[1] = 7  a[2] = 15  a[3] = 28  a[4] = 29  a[5] = 31  a[6] = 39  a[7] = 58  a[8] = 68  a[9] = 70 

 

2. 새로운 검색 범위의 중앙값 a[7]을 찾습니다.  검색하려는 값(39)이 58보다 작기 때문에 a[7]보다 작은 배열로 검색 대상을 좁힙니다. 

a[0] = 5  a[1] = 7  a[2] = 15  a[3] = 28  a[4] = 29  a[5] = 31  a[6] = 39  a[7] = 58  a[8] = 68  a[9] = 70 

 

3. 새로운 검색 범위의 중앙값을 찾습니다. 둘 중 (5+6) /2 은 5이기 때문에 a[5]부터 검색하여 원하는 값인지 확인 하고 검색대상을 좁혀 검색값을 찾습니다. 

a[0] = 5  a[1] = 7  a[2] = 15  a[3] = 28  a[4] = 2 a[5] = 31  a[6] = 39  a[7] = 58  a[8] = 68  a[9] = 70 
package javaStudy;

import java.util.Scanner;

public class ch3_3 {

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        
        System.out.print("배열 수 : ");
        int num = stdIn.nextInt();
        int[] x = new int[num];
        
        System.out.print("x[0] :");
        x[0] = stdIn.nextInt();
        
        // 이진검색의 전제조건은 데이터가 키 값으로 이미 정렬(sort)되어 있다고 가정.
        // 오름차순으로 입력을 차례대로 받는 부분  
        for (int i = 1; i < x.length; i++) {
            do {
                System.out.print("x["+i+"] :");
                x[i] = stdIn.nextInt();
            } while (x[i] < x[i-1]);
        }
        
        System.out.print("검색할 값 : ");
        int key = stdIn.nextInt();
        int res = binarySearch(x, num, key);
        
        if(res!=-1) {
            System.out.println("검색 값은 " + (res+1) + "번 째에 있습니다.");
        }else {
            System.out.println("검색 한 값이 없습니다.");
        }
    }
    
    // 이진검색
    public static int binarySearch(int[] a, int num, int key) {
        int max = num-1; //0부터 시작이기 때문에 
        int min = 0;
        int i = 0;
        
        do {
            i = (min+max)/2;
            if(a[i] < key) {
                min = i+1;
                
            }else if(a[i] > key) {
                max = i-1;
                
            }else if(a[i] == key) {
                return i;
            }
        } while (min <= max);
        
        return -1;
    }
}
 

 

 

 

java에서 이진검색 표준 라이브러리 메서드를 제공합니다. 

- java.util.Arrays 클래스의 binarySearch 메서드

 

검색에 실패한 경우 검색값 보다 큰 요소 중 첫번째 값의 인덱스를 x라 하고 -x-1 값을 반환 합니다. 

 

 

 

 

 

 

- 이진검색 라이브러리를 사용하면 이진검색 메서드를 직접 코딩 할 필요 없이 간단하게 표현 가능합니다. 모든 자료형 배열에서 검색 가능합니다. 
 
package javaStudy;

import java.util.Arrays;
import java.util.Scanner;

public class ch3_3 {

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        
        System.out.print("배열 수 : ");
        int num = stdIn.nextInt();
        int[] x = new int[num];
        
        System.out.print("x[0] :");
        x[0] = stdIn.nextInt();
    
        
        // 이진검색의 전제조건은 데이터가 키 값으로 이미 정렬(sort)되어 있다고 가정.
        // 오름차순으로 입력을 차례대로 받는 부분  
        for (int i = 1; i < x.length; i++) {
            do {
                System.out.print("x["+i+"] :");
                x[i] = stdIn.nextInt();
            } while (x[i] < x[i-1]);
        }
        
        System.out.print("검색할 값 : ");
        int key = stdIn.nextInt();
        //int res = binarySearch(x, num, key);
        int res = Arrays.binarySearch(x, key);
        if(res!=-1) {
            System.out.println("검색 값은 " + (res+1) + "번 째에 있습니다.");
        }else {
            System.out.println("검색 한 값이 없습니다.");
        }
    }
}
 
 
 

 

- Do it 자료구조와 함께 배우는 알고리즘 입문 자바편 스터디 정리

 

반응형