logo

Cerca binària a Java

La cerca binària és una de les tècniques de cerca que s'apliquen quan s'ordena l'entrada, aquí ens estem centrant a trobar l'element central que actua com a marc de referència per anar-hi a l'esquerra o a la dreta, ja que els elements ja estan ordenats. Aquesta cerca ajuda a optimitzar la tècnica de cerca amb cada iteració que es coneix com a cerca binària i els lectors hi destaquen, ja que s'aplica indirectament en la resolució de preguntes.

Cerca binària

Algorisme de cerca binària a Java

A continuació es mostra l'algoritme dissenyat per a la cerca binària:



  1. Començar
  2. Preneu matriu d'entrada i Target
  3. Inicialitzar inici = 0 i final = (mida de matriu -1)
  4. Indianitzar variable mitjana
  5. mig = (inici+final)/2
  6. si array[mid] == target, retorna mid
  7. si matriu[mitjana]
  8. si array[ mid ]> target aleshores final = mid-1
  9. si inici<=final, aneu al pas 5
  10. retorna -1 com a element no trobat
  11. Sortida

Ara heu d'estar pensant què passa si l'entrada no s'ordena, els resultats no estan definits.

Nota: Si hi ha duplicats, no hi ha cap garantia de quin es trobarà.

Mètodes per a la cerca binària de Java

Hi ha tres mètodes a Java per implementar Cerca binària en Java s'esmenten a continuació:

  1. Mètode iteratiu
  2. Mètode recursiu
  3. Mètode Inbuild

1. Mètode iteratiu per a la cerca binària a Java

A continuació s'esmenta la implementació a continuació:

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);> >}> }>

>

>

Sortida

harald baldr
Element found at index 3>

Consell: Frikis, us heu de preguntar si hi ha alguna funció com cota inferior() o límit_superior() probablement es trobi a C++ STL. així que la resposta directa és que no hi havia cap funció només fins a Java 9, més tard es van afegir.

2. Mètode recursiu per a la cerca binària

A continuació es mostra la implementació del mètode anterior:

Java




// 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);> >}> }>

>

>

Sortida

Element is present at index 3>

Complexitat del mètode anterior

Complexitat temporal: O (log N)
Complexitat espacial: O (1), si es considera la pila de trucades recursives, l'espai auxiliar serà O (log N)

3. Al Mètode de compilació per a la cerca binària a Java

Arrays.binarysearch() funciona per a matrius que també poden ser de tipus de dades primitives.

A continuació es mostra la implementació del mètode anterior:

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'>);> >}> }>

>

>

Sortida

22 found at index = 3 40 Not found>

Cerca binària a les col·leccions de Java

Ara vegem com funciona Collections.binarySearch() per a LinkedList. Així, bàsicament, com s'ha comentat anteriorment, aquest mètode s'executa en temps de registre (n) per a una llista d'accés aleatori com ArrayList. Si la llista especificada no implementa la interfície RandomAccess i és gran, aquest mètode farà una cerca binària basada en iteradors que realitza recorreguts d'enllaç O(n) i comparacions d'elements O(log n).

Collections.binarysearch() treballa per a objectes Col·leccions com ArrayList i LinkedList .

A continuació es mostra la implementació del mètode anterior:

Java




// 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'>);> >}> }>

>

>

Sortida

10 found at index = 3 15 Not found>

La complexitat del mètode anterior

Complexitat temporal : O (log N)
Espai auxiliar : O(1)