프로그래밍

이진탐색(binary search)

바이오닉크로니클 2024. 12. 10. 01:05

 

1. 배열의 중간값을 확인한다.
2. 찾고자 하는 값이 중간 값보다 작으면 왼쪽 절반을 탐색한다.
3. 찾고자 하는 값이 중간 값보다 크면 오른쪽 절반을 탐색한다.
4. 값을 찾거나 탐색 범위가 없을 때까지 이 과정을 반복한다.

시간 복잡도: O(logn) (효율적)
정렬된 데이터에서만 사용 가능

 

public class BinarySearch {  
    public static int binarySearch(int[] arr, int target){  
        int left = 0;  
        int right = arr.length - 1;  
  
        while(left <= right){  
            // 1 2 3  
            // 1 + (3 - 1) / 2 = 2            // 1 2 3 4            // 1 + (4 - 1) / 2 = 2            int mid = left + (right - left) / 2; // 중간 인덱스 계산  
  
            if(arr[mid] == target){  
                return mid; // 값을 찾음  
            }else if(arr[mid] < target){  
                left = mid + 1; // 오른쪽 절반 탐색  
            }else {  
                right = mid - 1; // 왼쪽 절반 탐색  
            }  
        }  
        return -1; // 값을 찾지 못함  
    }  
  
    public static void main(String[] args) {  
        int[] sortedArray = {1, 3, 5, 7, 9, 11, 13};  
        int target = 7;  
  
        int result = binarySearch(sortedArray, target);  
        if(result != -1){  
            System.out.println("값 " + target + "는 인덱스 " + result + "에 있습니다.");  
        }else{  
            System.out.println("값 " + target + "를 찾을 수 없습니다.");  
        }  
    }  
}

 

적용상황
1. 데이터가 정렬된 경우
- 배열이나 리스트에서 값을 찾는 문제
- 로그 파일에서 특정 이벤트를 찾는 경우
2. 특정 조건을 만족하는 값을 효율적으로 탐색할 때
- 특정 범위 내에서 최적의 값을 찾기