inblog logo
|
chodong
    java

    018_이진 검색(BinarySearch)

    Dec 18, 2023
    018_이진 검색(BinarySearch)
    Contents
    이진 검색(BinarySearch)

    이진 검색(BinarySearch)

    • 정렬된 데이터 집합에서 특정 값을 빠르게 찾는 검색 알고리즘이다.
    • 알고리즘은 '분할 정복' 전략을 사용하여 검색 범위를 반으로 줄여나가며 원하는 값을 찾는 방식으로 작동한다.
    • 시간 복잡도는 log2(n) 이때 n은 배열의 개수이다. 한마디로 배열 하나를 늘린다고 시간이 1씩 증가 하는게 아니라는 것이다.
    ☝
    데이터가 많아 질수록 풀스캔 보다 이진 검색이 유리하다. 하지만! 찾아야 하는 데이터의 수에 따라서 풀스캔과 이진트리의 효율성이 달라진다! → 이진 트리는 찾아야 하는 데이터가 많이 질수록 풀스캔 보다 더 많이 조회하므로 효율이 떨어진다. (이진 트리는 동일한 것을 찾을 때는 오래 걸린다.) → 데이터가 많아질수록 풀스캔 보다 이진 트리이 유리하다. 이유! 시간 복잡도를 보면 쉽게 이해가 가능하다! 풀스캔 → O(N) 인덱스스캔 → O(logN) 전체 데이터의 15프로 이하면 인덱스 스캔(이진 검색)이 더 빠르다! ex) log2(20) = 5(4.x) 이므로 20개의 데이터를 조회할 때 인덱스 스캔으로 3개 까지는 더 유리한데 4개 이상부터는 풀스캔이 유리하다.

    이진 검색 예제
    package ex03; public class BinarySearch { public static void main(String[] args) { // N = 21 // 시간복잡도 log2(N) -> log2(21) -> 4.x (max를 의미함) // 이진 검색 => 반드시 정렬이 되어 있어야 한다. // 21 / 2*2*2*2*2 -> logn -> log21 int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; int N = arr.length; final int target = 2; int start = 0; int end = N - 1; int mid; int round = 1; while (true) { // 1 회전 mid = start + ((end - start) / 2); // 기대값 7 System.out.println("mid : " + mid); if (arr[mid] == target) { System.out.println(round + "회전 : " + target + "값은 " + mid + "번지에 있습니다"); break; } if (arr[mid] < target) { // 기대값 start 5, end 8 start = mid + 1; } if (arr[mid] > target) { end = mid - 1; } System.out.println(round + "회전 start : " + start); System.out.println(round + "회전 end : " + end); round++; } System.out.println("시간복잡도 : " + (Math.log(N) / Math.log(2))); } }
    출력 결과
    notion image
     
    외워 두면 좋을 것!
    log2(8) = 3 log2(16) = 4 log2(65536) = 16
    O(N) O(1) O(logN)
    Share article

    chodong

    RSS·Powered by Inblog