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.
Algorisme de cerca binària a Java
A continuació es mostra l'algoritme dissenyat per a la cerca binària:
- Començar
- Preneu matriu d'entrada i Target
- Inicialitzar inici = 0 i final = (mida de matriu -1)
- Indianitzar variable mitjana
- mig = (inici+final)/2
- si array[mid] == target, retorna mid
- si matriu[mitjana]
- si array[ mid ]> target aleshores final = mid-1
- si inici <=final, aneu al pas 5
- retorna -1 com a element no trobat
- 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ó:
- Mètode iteratiu
- Mètode recursiu
- 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
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)