코디잉

03_이진 검색(binary search) 본문

자료구조&알고리즘/이론공부

03_이진 검색(binary search)

yong_ღ'ᴗ'ღ 2022. 8. 19. 02:53

- 복잡도: O(log n)

- 전제 조건: 데이터가 키 값으로 이미 정렬되어 있다. 

- 장점: 선형 검색보다 좀 더 빠르게 검색할 수 있음

- 한 단계를 진행할 때마다 검색 범위가 거의 반씩 좁혀짐

- 검색 종료 조건 (둘 중 하나라도 성립되면 종료됨)

① arr[pc](검사 요소, 중앙 요소)와 key가 일치하는 경우 (발견한 요소의 인덱스 반환)

② 검색 범위가 더 이상 없는 경우 (-1 반환)

static int binSearch(int[] arr, int n, int key) {
    int pl = 0;         // 검색 범위의 첫 인덱스
    int pr = n - 1;     // 검색 범위의 끝 인덱스

    do {
        int pc = (pl + pr) / 2;     // 중앙 요소의 인덱스
        if (arr[pc] == key)
            return pc;
        else if (arr[pc] < key)
            pl = pc + 1;
        else
            pr = pc - 1;
    } while (pl <= pr);

    return -1;
}

- Java는 배열에서 이진 검색을 하는 메서드를 표준 라이브러리로 제공한다.

→ java.util.Arrays 클래스의 binarySearch() 메서드

: 모든 자료형 배열에서 검색 가능

: 검색 성공한 경우 → 찾은 요소의 인덱스 반환

: 검색 실패한 경우 → 음수 반환(-삽입포인트-1)

 *삽입포인트: 검색 key 보다 큰 요소 중 첫 번째 요소의 인덱스

 

+) String 클래스는 Comparable<T> 인터페이스와 compareTo() 메서드를 구현하고 있다.

내가 만든 클래스 A로 정렬 구현하려면,

// Comparable<T> 인터페이스 구현
class A implements Comparable<A> {

	// compareTo() 메서드 구현
	public int compareTo(A a) { 
    	// this가 a보다 크면 양수 반환
        // this가 a보다 작으면 음수 반환
        // this가 a와 같으면 0 반환
    }
    
    // equals() 메서드 구현
    public boolean equals(Object obj) {
    	// this가 obj와 같으면 true 반환
        // this가 obj와 다르면 false 반환
    }
}

- 자연 정렬로 정렬되지 않은 배열에서 검색하기: 제너릭 메서드(generic method) 사용

static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) {}

→ 3번째 매개변수에 comparator를 전달해야 한다.

+)  java.util.Comparator 인터페이스

+) comparator를 직접 구현하려면, Comparator 인터페이스를 구현한 클래스를 정의하고, 두 객체의 대소 관계를 비교하여 결과를 반환하는 compare() 메서드를 구현한다.

그리고 그 클래스형 인스턴스를 생성해야 한다.

import java.util.Comparator;

class X {
    // 클래스형 인스턴스 생성
    public static final Comparator<T> COMPARATOR = new Comp();

    // compare() 메서드 구현
    private static class Comp implements Comparator<T> {
        public int compare(T o1, T o2) {
            // o1이 o2보다 크면 양수 반환
            // o1이 o2보다 작으면 음수 반환
            // o1과 o2가 같으면 0 반환
        }
    }
}

→ binarySearch()의 세번째 매개변수로 X.COMPARATOR 로 전달해주면 된다.

 꼭 찾으려는 값으로 정렬되어 있어야 함!!!!

 

+)

- 복잡도: 차원이 가장 높은 복잡도를 선택함

- 복잡도 대소 관계

O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(n^k) < O(2ⁿ) < O(n!)

 

'자료구조&알고리즘 > 이론공부' 카테고리의 다른 글

06_재귀 알고리즘  (0) 2022.08.26
05_큐(queue)  (0) 2022.08.19
04_스택(stack)  (0) 2022.08.19
02_선형 검색(linear search)  (0) 2022.08.19
01_배열  (0) 2022.08.18
Comments