Java 알고리즘 탐색: 이진 검색에 대한 자세한 설명

이진 검색은 정렬된 배열에서 특정 요소를 찾아야 할 때 효율적인 알고리즘입니다. 시간 복잡도는 O(log n)으로 선형 검색의 O(n)에 비해 이진 검색은 검색 효율성을 크게 향상시킬 수 있습니다. 이 기사에서는 이진 검색이 무엇인지, 그리고 이를 Java에서 구현하는 방법을 자세히 설명합니다.

이진 검색 소개

이진 검색이라고도 하는 이진 검색은 정렬된 배열에서 대상 요소를 찾는 알고리즘입니다. 대상 요소를 찾거나 대상 요소가 없다고 판단될 때까지 검색 범위를 지속적으로 절반으로 줄이는 것이 원칙이다. 이진 검색의 단계는 다음과 같습니다.

  1. 왼쪽 경계 left를 배열의 첫 번째 요소 인덱스로 초기화하고 오른쪽 경계 right를 배열의 마지막 요소 인덱스로 초기화합니다.
  2. (왼쪽 + 오른쪽) / 2와 같은 중간 요소의 인덱스 mid를 계산합니다.
  3. 중간 요소를 대상 요소와 비교합니다.
  • 중간 요소가 대상 요소와 같으면 대상을 찾고 중간 요소의 인덱스가 반환됩니다.
  • 중간 요소가 대상 요소보다 큰 경우 오른쪽 경계를 mid - 1로 업데이트하고 왼쪽 절반에서 계속 검색합니다.
  • 중간 요소가 대상 요소보다 작은 경우 왼쪽 경계를 mid + 1로 업데이트하고 오른쪽 절반에서 계속 검색합니다.
  1. 대상 요소를 찾거나 왼쪽 경계가 오른쪽 경계를 초과할 때까지 2단계와 3단계를 반복합니다.

Java는 이진 검색을 구현합니다.

다음은 Java에서 이진 검색을 구현하는 샘플 코드입니다.

/**
 * 二分查找
 */
public static int binarySearch(int[] intArr,int key){
    
    
    int left = 0;
    int right = intArr.length -1;

    while(left <= right){
    
    
        //计算中间元素的索引
        int mid = (left + right) >>> 1;
        //获取中间元素的值
        int midVal = intArr[mid];
        //比较中间元素和目标元素的值
        //如果中间元素小于目标元素,则将左边界更新为 mid + 1,继续在右半边查找。
        if (midVal < key)
            left = mid + 1;
        //如果中间元素大于目标元素,则将右边界更新为 mid - 1,继续在左半边查找。
        else if (midVal > key)
            right = mid - 1;
        //如果中间元素等于目标元素,则找到目标,返回中间元素的索引。
        else
            return mid;
    }

    //如果循环结束仍未找到目标元素,返回一个负数,表示未找到,通常为-(left + 1)
    return -(left + 1);
}

public static void main(String[] args) {
    
    

    int[] intArray = new int[]{
    
    2,4,5,7,9,11,16,23,45,67};

    System.out.println(binarySearch(intArray,5));
    System.out.println(binarySearch(intArray,23));
    System.out.println(binarySearch(intArray,1));
    System.out.println(binarySearch(intArray,20));
    System.out.println(binarySearch(intArray,110));

}

출력은 다음과 같습니다

2
7
-1
-8
-11

위 코드에서 BinarySearch 메소드는 정렬된 배열 intArr과 대상 요소 키를 매개변수로 받아들인 다음 이진 검색 알고리즘을 사용하여 배열에서 대상 요소의 인덱스를 찾습니다. 대상 요소가 발견되면 해당 인덱스가 반환되고, 그렇지 않으면 대상 요소가 존재하지 않음을 나타내기 위해 음수가 반환됩니다.

지침

이진 검색의 전제는 배열이 정렬 되어야 한다는 것입니다 . 그렇지 않으면 제대로 작동하지 않습니다. 배열이 정렬되지 않은 경우 이진 검색 알고리즘을 사용하려면 먼저 배열을 정렬해야 합니다.

요약하다

이진 검색은 정렬된 배열에 적합한 효율적인 검색 알고리즘입니다. 시간 복잡도는 O(log n)입니다. 여기서 n은 배열의 길이입니다. 반복할 때마다 검색 범위가 절반으로 줄어들기 때문에 특히 순서가 큰 배열의 경우 선형 검색과 같은 단순 검색 알고리즘보다 더 효율적입니다. 이진 검색 알고리즘을 주의 깊게 구현하고 이해하면 이를 Java에 쉽게 적용하여 다양한 검색 문제를 해결할 수 있습니다.

추천

출처blog.csdn.net/weixin_44002151/article/details/132822775