logo

Java의 이진 검색

이진 검색은 입력이 정렬될 때 적용되는 검색 기술 중 하나입니다. 여기서는 요소가 이미 정렬되어 있으므로 왼쪽으로 갈지 오른쪽으로 갈지 참조 프레임 역할을 하는 중간 요소를 찾는 데 중점을 둡니다. 이 검색은 매 반복마다 검색 기술을 최적화하는 데 도움이 되며 이진 검색이라고 하며 질문 해결에 간접적으로 적용되므로 독자는 이에 대해 스트레스를 받습니다.

이진 검색

Java의 이진 검색 알고리즘

다음은 이진 검색을 위해 설계된 알고리즘입니다.



  1. 시작
  2. 입력 배열 및 대상 가져오기
  3. 시작 = 0 및 끝 = (배열 크기 -1) 초기화
  4. 인도화 중간 변수
  5. 중간 = (시작+끝)/2
  6. array[ mid ] == target이면 mid를 반환합니다.
  7. 만약 배열[ mid ]
  8. 배열[ mid ]> target이면 end = mid-1
  9. start<=end인 경우 5단계로 이동
  10. 요소를 찾을 수 없음으로 -1을 반환합니다.
  11. 출구

이제 입력이 정렬되지 않으면 결과가 정의되지 않을 것이라고 생각해야 합니다.

메모: 중복된 항목이 있으면 어느 항목이 발견될지 보장할 수 없습니다.

Java 바이너리 검색 방법

Java에는 구현하는 세 가지 메소드가 있습니다. 이진 검색 Java에서는 다음과 같이 언급됩니다.

  1. 반복 방법
  2. 재귀적 방법
  3. 내장 방법

1. Java의 이진 검색을 위한 반복 방법

아래에 언급된 구현은 다음과 같습니다.

자바




// Java implementation of iterative Binary Search> class> BinarySearch {> >// Returns index of x if it is present in arr[l....r], else return -1> >int> binarySearch(>int> arr[],>int> l,>int> r,>int> x)> >{> >while> (l <= r) {> >int> mid = (l + r) />2>;> >// If the element is present at the> >// middle itself> >if> (arr[mid] == x) {> >return> mid;> >// If element is smaller than mid, then> >// it can only be present in left subarray> >// so we decrease our r pointer to mid - 1> >}>else> if> (arr[mid]>x) {> >r = mid ->1>;> >// Else the element can only be present> >// in right subarray> >// so we increase our l pointer to mid + 1> >}>else> {> >l = mid +>1>;> >}> >}> >// We reach here when element is not present> >// in array> >return> ->1>;> >}> >// Driver method to test above> >public> static> void> main(String args[])> >{> >BinarySearch ob =>new> BinarySearch();> >int> arr[] = {>2>,>3>,>4>,>10>,>40> };> >int> n = arr.length;> >int> x =>10>;> >int> result = ob.binarySearch(arr,>0>, n ->1>, x);> >if> (result == ->1>)> >System.out.println(>'Element not present'>);> >else> >System.out.println(>'Element found at index '> >+ result);> >}> }>

>

>

산출

쉘 스크립트의 for 루프
Element found at index 3>

팁: 괴짜 여러분은 다음과 같은 기능이 있는지 궁금할 것입니다. 하한() 또는 상한() C++ STL에서 발견되었을 가능성이 높습니다. 그래서 정답은 Java 9까지만 기능이 없었고 나중에 추가되었다는 것입니다.

2. 이진 검색을 위한 재귀적 방법

위 메소드를 구현하면 다음과 같습니다.

자바




// Java implementation of> // recursive Binary Search> // Driver Class> class> BinarySearch {> >// Returns index of x if it is present in arr[l..> >// r], else return -1> >int> binarySearch(>int> arr[],>int> l,>int> r,>int> x)> >{> >if> (r>= l) {> >int> mid = l + (r - l) />2>;> >// If the element is present at the> >// middle itself> >if> (arr[mid] == x)> >return> mid;> >// If element is smaller than mid, then> >// it can only be present in left subarray> >if> (arr[mid]>x)> >return> binarySearch(arr, l, mid ->1>, x);> >// Else the element can only be present> >// in right subarray> >return> binarySearch(arr, mid +>1>, r, x);> >}> >// We reach here when element is not present> >// in array> >return> ->1>;> >}> >// main function> >public> static> void> main(String args[])> >{> >BinarySearch ob =>new> BinarySearch();> >int> arr[] = {>2>,>3>,>4>,>10>,>40> };> >int> n = arr.length;> >int> x =>10>;> >int> result = ob.binarySearch(arr,>0>, n ->1>, x);> >if> (result == ->1>)> >System.out.println(> >'Element is not present in array'>);> >else> >System.out.println(> >'Element is present at index '> + result);> >}> }>

>

>

산출

Element is present at index 3>

위 방법의 복잡성

시간 복잡도: 오(로그 N)
공간 복잡도: O(1), 재귀 호출 스택을 고려하면 보조 공간은 O(log N)입니다.

3. Java에서 이진 검색을 위한 빌드 방법

배열.바이너리검색() 기본 데이터 유형일 수 있는 배열에서도 작동합니다.

위 메소드를 구현하면 다음과 같습니다.

자바




// Java Program to demonstrate working of binarySearch()> // Method of Arrays class In a sorted array> // Importing required classes> import> java.util.Arrays;> // Main class> public> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Declaring an integer array> >int> arr[] = {>10>,>20>,>15>,>22>,>35> };> >// Sorting the above array> >// using sort() method of Arrays class> >Arrays.sort(arr);> >int> key =>22>;> >int> res = Arrays.binarySearch(arr, key);> >if> (res>=>0>)> >System.out.println(> >key +>' found at index = '> + res);> >else> >System.out.println(key +>' Not found'>);> >key =>40>;> >res = Arrays.binarySearch(arr, key);> >if> (res>=>0>)> >System.out.println(> >key +>' found at index = '> + res);> >else> >System.out.println(key +>' Not found'>);> >}> }>

>

>

산출

22 found at index = 3 40 Not found>

Java 컬렉션의 이진 검색

이제 LinkedList에서 Collections.binarySearch()가 어떻게 작동하는지 살펴보겠습니다. 따라서 기본적으로 위에서 설명한 대로 이 메서드는 ArrayList와 같은 임의 액세스 목록에 대해 log(n) 시간에 실행됩니다. 지정된 목록이 RandomAccess 인터페이스를 구현하지 않고 크기가 큰 경우 이 메서드는 O(n) 링크 순회 및 O(log n) 요소 비교를 수행하는 반복자 기반 이진 검색을 수행합니다.

Collections.binarysearch() 다음과 같은 개체 컬렉션에서 작동합니다. 배열목록 그리고 링크드리스트 .

위 메소드를 구현하면 다음과 같습니다.

자바




// Java Program to Demonstrate Working of binarySearch()> // method of Collections class> // Importing required classes> import> java.util.ArrayList;> import> java.util.Collections;> import> java.util.List;> // Main class> public> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Creating an empty ArrayList of integer type> >List al =>new> ArrayList();> >// Populating the Arraylist> >al.add(>1>);> >al.add(>2>);> >al.add(>3>);> >al.add(>10>);> >al.add(>20>);> >// 10 is present at index 3> >int> key =>10>;> >int> res = Collections.binarySearch(al, key);> >if> (res>=>0>)> >System.out.println(> >key +>' found at index = '> + res);> >else> >System.out.println(key +>' Not found'>);> >key =>15>;> >res = Collections.binarySearch(al, key);> >if> (res>=>0>)> >System.out.println(> >key +>' found at index = '> + res);> >else> >System.out.println(key +>' Not found'>);> >}> }>

>

>

산출

10 found at index = 3 15 Not found>

위 방법의 복잡성

시간 복잡도 : O(로그 N)
보조 공간 : ㅇ(1)