이 기사는 참조를 위해 이진 검색을 구현하는 Java의 변형을 공유합니다. 특정 내용은 다음과 같습니다
정상적인 이진 검색 :
먼저 일반 이진 검색을 검토하십시오
참고 : 바이너리 검색에는 문제가 있습니다. 배열에 {3, 3, 3, 3}과 같은 배열에 복제가있을 때 바이너리 검색 3이되면 반환이 ARR [1]이므로 이진 검색이 3의 첫 번째 발생 위치를 반환하지 않습니다.
Public Class BinarySearch {public static <t는 비슷한 <? super t >> int search (t arr [], t value) {int left = 0; int right = arr.length -1; while (왼쪽 <= 오른쪽) {int mid = (왼쪽 & 오른쪽) + ((왼쪽 ^ 오른쪽) >> 1); if (arr [mid] .compareto (value) == 0) {리턴 미드; } else if (arr [mid] .compareto (value)> 0) {오른쪽 = mid -1; } else {왼쪽 = mid + 1; }} 반환 -1; } public static void main (String [] args) {integer [] arr = new Integer [] {1, 3, 3, 6, 7, 9}; //- 1 System.out.println (검색 (ARR, 0)); // 0 System.out.println (검색 (ARR, 1)); // 5 system.out.println (검색 (ARR, 9)); //- 1 System.out.println (검색 (ARR, 10)); // 2 System.out.println (검색 (ARR, 3)); }}이중 변형 : FindFirst 함수
정상적인 이진 검색에서 [왼쪽 ...... 오른쪽] 좌회전 및 오른쪽 입원 간격을 검색하십시오. 값이있는 요소가 발견되면 찾을 수 있습니다. 이 FindFirst 기능에서는 그렇지 않습니다. [왼쪽 ... 오른쪽] 왼쪽으로 정리 된 오른쪽으로 정리 된 오른쪽 구간 간격에서 값이있는 요소가 오른쪽 = mid-1 대신 값과 같고 오른쪽 = 중간에 [왼쪽] 왼쪽] 오른쪽으로 구성된 오른쪽으로 구성된 오른쪽 구간에서 계속 검색하십시오. 왼쪽 == 오른쪽이 마침내 종료되면 루프가 종료됩니다.
루프를 종료 한 후 값이 발견 될 수 있거나 루프가 전체 배열을 가로 지른 후 값을 찾지 못하고 루프를 종료 할 수 있습니다.
따라서 루프를 종료 한 후에는 어떤 상황이 있는지 판단해야합니다.
Public Class BinarySearch {public static <t는 비슷한 <? super t >> int findfirst (t arr [], t value) {int left = 0; int right = arr.length -1; // 왼쪽에 종료> = 오른쪽으로 종료하면, "="상황은 바이너리와 다릅니다. if (arr [mid] .compareto (value) <0) {왼쪽 = mid + 1; } else {right = mid; }} // 위의 루프가 횡단 된 후. 가치가 발견 되었습니까? 아직도 가치가 없습니까? 그냥 판단하십시오. if (arr [left] == value) {return left; } else {return -1; }} public static void main (String [] args) {integer [] arr = new Integer [] {1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 9}; // -1 System.out.println (findfirst (arr, 0)); // 0 System.out.println (FindFirst (ARR, 1)); // 12 system.out.println (findfirst (arr, 9)); //- 1 System.out.println (FindFirst (ARR, 10)); // 1 System.out.println (findfirst (arr, 3)); }}이중 변형 : 기능이 적습니다
소개하다
배열과 변수 값이 주어지면 값에 가장 가까운 배열에서 값보다 작은 숫자를 찾으십시오. 예를 들어 ARR = {11, 22, 22, 33, 33, 33, 44, 54} value = 33.22는 값에 가장 가깝고 값보다 작습니다.
따라서 대답은 2 (배열 ARR의 하단 코너 마커에서 22)입니다.
값보다 작은 숫자가없는 경우 출력 -1.
해결책
이진 검색 방법을 사용하십시오. 매번 ARR [MID]를 사용하여 값과 비교하십시오. 작고 평등하며 왼쪽으로 가서 찾아보십시오. 크게, 그것을 찾기 위해 권리로 가십시오. 이전 문장에서 "동등한"상황을 이해하지 못할 수도 있습니다. 일반적인 이진 검색은 ARR [MID] == 값을 찾는 것이지만, 기능은 적은 기능은 값보다 작은 숫자를 찾는 것이므로 ARR [MID] == 값이지만 왼쪽에서 더 작은 값을 계속 찾아야합니다.
예
암호
Public Class BinarySearch {public static <t는 비슷한 <? super t >> int Fewer (t arr [], t value) {int left = 0; int right = arr.length -1; // 왼쪽> 오른쪽 (왼쪽 <= 오른쪽) {int mid = (왼쪽 및 오른쪽) + ((왼쪽 ^ 오른쪽) >> 1); if (value.compareto (arr [mid]) <= 0) {right = mid -1; } else {왼쪽 = mid + 1; }} 오른쪽 반환; } public static void main (String [] args) {integer [] arrf = new Integer [] {21, 23, 25, 25, 31, 34, 37, 39, 52, 63}; // 3 System.out.println (Fewer (Arrf, 30)); }}이중 변형 : 더 큰 기능
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.