Questo tutorial spiega la ricerca binaria e la ricerca binaria ricorsiva in Java con il suo algoritmo, la sua implementazione ed esempi di codice di ricerca binaria in Java:
La ricerca binaria in Java è una tecnica utilizzata per cercare un valore o una chiave mirata in un insieme. È una tecnica che utilizza la tecnica "divide et impera" per cercare una chiave.
L'insieme su cui applicare la ricerca binaria per cercare una chiave deve essere ordinato in ordine crescente.
Di solito, la maggior parte dei linguaggi di programmazione supporta le tecniche di ricerca lineare, ricerca binaria e hashing, che vengono utilizzate per cercare i dati nella raccolta. Impareremo l'hashing nelle esercitazioni successive.
Ricerca binaria in Java
La ricerca lineare è una tecnica di base, in cui l'array viene attraversato in sequenza e ogni elemento viene confrontato con la chiave finché non viene trovata la chiave o non si raggiunge la fine dell'array.
La ricerca lineare viene utilizzata raramente nelle applicazioni pratiche. La ricerca binaria è la tecnica più utilizzata perché è molto più veloce della ricerca lineare.
Java offre tre modi per eseguire una ricerca binaria:
- Utilizzo dell'approccio iterativo
- Utilizzo di un approccio ricorsivo
- Utilizzando il metodo Arrays.binarySearch ().
In questa esercitazione, implementeremo e discuteremo tutti e tre questi metodi.
Algoritmo per la ricerca binaria in Java
Nel metodo di ricerca binaria, l'insieme viene ripetutamente diviso a metà e l'elemento chiave viene cercato nella metà sinistra o destra dell'insieme, a seconda che la chiave sia minore o maggiore dell'elemento centrale dell'insieme.
Un semplice algoritmo di ricerca binaria è il seguente:
- Calcolare l'elemento medio della collezione.
- Confrontate gli elementi chiave con l'elemento centrale.
- Se chiave = elemento centrale, si restituisce la posizione centrale dell'indice per la chiave trovata.
- Altrimenti, se chiave> elemento medio, la chiave si trova nella metà destra dell'insieme. Ripetere quindi i passaggi da 1 a 3 sulla metà inferiore (destra) dell'insieme.
- Se key <mid element, la chiave si trova nella metà superiore dell'insieme, quindi è necessario ripetere la ricerca binaria nella metà superiore.
Come si può vedere dai passaggi precedenti, nella ricerca binaria metà degli elementi dell'insieme vengono ignorati subito dopo il primo confronto.
Si noti che la stessa sequenza di passaggi vale sia per la ricerca binaria iterativa che per quella ricorsiva.
Illustriamo l'algoritmo di ricerca binaria con un esempio.
Ad esempio, prendiamo la seguente matrice ordinata di 10 elementi.
Calcoliamo la posizione centrale dell'array.
Metà = 0+9/2 = 4
#1) Chiave = 21
Per prima cosa, confronteremo il valore della chiave con l'elemento [mid] e scopriremo che il valore dell'elemento mid = 21.
Si scopre così che chiave = [mid]. Quindi la chiave si trova nella posizione 4 dell'array.
#2) Chiave = 25
Per prima cosa confrontiamo il valore della chiave con mid. Poiché (21 <25), cercheremo direttamente la chiave nella metà superiore dell'array.
Ora troveremo di nuovo il mid per la metà superiore dell'array.
Medio = 4+9/2 = 6
Il valore nella posizione [mid] = 25
Ora confrontiamo l'elemento chiave con l'elemento centrale. Quindi (25 == 25), quindi abbiamo trovato la chiave nella posizione [centrale] = 6.
In questo modo dividiamo ripetutamente l'array e, confrontando l'elemento chiave con la metà, decidiamo in quale metà cercare la chiave. La ricerca binaria è più efficiente in termini di tempo e correttezza ed è anche molto più veloce.
Implementazione della ricerca binaria in Java
Utilizzando l'algoritmo di cui sopra, implementiamo un programma di ricerca binaria in Java utilizzando l'approccio iterativo. In questo programma, prendiamo un array di esempio ed eseguiamo una ricerca binaria su questo array.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("L'array di input: " + Arrays.toString(numArray)); //chiave da ricercare int key = 20; System.out.println("\nChiave da ricercare=" + key); //impostare il primo al primo indice int first = 0; //impostare l'ultimo all'ultimo elemento dell'array int last=numArray.length-1; //calcolare la metà dell'arrayarray int mid = (first + last)/2; //mentre first e last non si sovrappongono while( first <= last ){ //se la chiave mid <è nella prima metà dell'array if ( numArray[mid] last ){ System.out.println("Elemento non trovato!"); } } } }
Uscita:
L'array di input: [5, 10, 15, 20, 25, 30, 35].
Chiave da cercare=20
L'elemento si trova all'indice: 3
Il programma precedente mostra un approccio iterativo alla ricerca binaria. Inizialmente viene dichiarato un array, quindi viene definita una chiave da ricercare.
Dopo aver calcolato la metà dell'array, la chiave viene confrontata con l'elemento centrale e, a seconda che la chiave sia minore o maggiore della chiave, viene cercata rispettivamente nella metà inferiore o superiore dell'array.
Ricerca binaria ricorsiva in Java
È possibile eseguire una ricerca binaria anche con la tecnica della ricorsione, in cui il metodo di ricerca binaria viene richiamato in modo ricorsivo finché non viene trovata la chiave o l'intero elenco è esaurito.
Il programma che implementa una ricerca binaria ricorsiva è riportato di seguito:
import java.util.*; class Main{ //metodo ricorsivo per la ricerca binaria public static int binary_Search(intArray[], int low, int high, int key){ //se l'array è in ordine allora eseguite la ricerca binaria sull'array if (high>=low){ //calcolate mid int mid = low + (high - low)/2; //se key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //se intArray[mid]> key allora key è a sinistrametà dell'array if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//ricerca ricorsiva della chiave }else //la chiave è nella metà destra dell'array { return binary_Search(intArray, mid+1, high, key);//ricerca ricorsiva della chiave } } return -1; } public static void main(String args[]){ //definizione dell'array e della chiave intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("InputLista: " + Arrays.toString(intArray)); int key = 31; System.out.println("´La chiave da cercare:" + key); int high=intArray.length-1; //callare il metodo di ricerca binaria int result = binary_Search(intArray,0,high,key); //stampare il risultato if (result == -1) System.out.println("´La chiave non è stata trovata nella lista data!"); else System.out.println("´La chiave è stata trovata nella posizione: "+result + " nella lista"); } }
Uscita:
Elenco degli ingressi: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
La chiave da ricercare:
La chiave si trova nella posizione: 3 dell'elenco
Utilizzando il metodo Arrays.binarySearch ().
La classe Arrays di Java fornisce un metodo "binarySearch ()" che esegue la ricerca binaria sull'array dato. Questo metodo prende come argomenti l'array e la chiave da ricercare e restituisce la posizione della chiave nell'array. Se la chiave non viene trovata, il metodo restituisce -1.
L'esempio seguente implementa il metodo Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //definire un array intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("L'array di input : " + Arrays.toString(intArray)); //definire la chiave da ricercare int key = 50; System.out.println("\nLa chiave da ricercare:" + key); //callare il metodo binarySearch sull'array dato con la chiave da ricercare int result =Arrays.binarySearch(intArray,key); //stampa del risultato if (result <0) System.out.println("\nKey non è stato trovato nell'array!"); else System.out.println("\nKey è stato trovato all'indice: "+result + " nell'array."); } }
Uscita:
La matrice di input: [10, 20, 30, 40, 50, 60, 70, 80, 90].
La chiave da ricercare:50
La chiave si trova all'indice: 4 dell'array.
Domande frequenti
D #1) Come si scrive una ricerca binaria?
Risposta: La ricerca binaria viene solitamente eseguita dividendo l'array a metà. Se la chiave da ricercare è maggiore dell'elemento centrale, viene ricercata la metà superiore dell'array dividendo e ricercando ulteriormente la sotto-array fino a trovare la chiave.
Allo stesso modo, se la chiave è inferiore all'elemento centrale, la chiave viene cercata nella metà inferiore dell'array.
D #2) Dove viene utilizzata la ricerca binaria?
Risposta: La ricerca binaria viene utilizzata principalmente per cercare dati ordinati nelle applicazioni software, soprattutto quando lo spazio di memoria è compatto e limitato.
D #3) Qual è il grande O della ricerca binaria?
Risposta: La complessità temporale della ricerca binaria è O (logn) dove n è il numero di elementi dell'array. La complessità spaziale della ricerca binaria è O (1).
D #4) La ricerca binaria è ricorsiva?
Risposta: Sì, poiché la ricerca binaria è un esempio di strategia divide et impera e può essere implementata utilizzando la ricorsione. Possiamo dividere l'array a metà e richiamare lo stesso metodo per eseguire la ricerca binaria più volte.
D #5) Perché si chiama ricerca binaria?
Risposta: L'algoritmo di ricerca binaria utilizza una strategia di divide et impera che taglia ripetutamente l'array a metà o in due parti. Per questo motivo prende il nome di ricerca binaria.
Conclusione
La ricerca binaria è la tecnica di ricerca più utilizzata in Java. Il requisito per eseguire una ricerca binaria è che i dati siano ordinati in ordine crescente.
Una ricerca binaria può essere implementata utilizzando un approccio iterativo o ricorsivo. La classe Arrays di Java fornisce anche il metodo 'binarySearch' che esegue una ricerca binaria su un Array.
Nelle esercitazioni successive esploreremo varie tecniche di ordinamento in Java.