Ce tutoriel explique la recherche binaire et la recherche binaire récursive en Java, ainsi que son algorithme, sa mise en œuvre et des exemples de code de recherche binaire en Java :
Une recherche binaire en Java est une technique utilisée pour rechercher une valeur ou une clé ciblée dans une collection. Il s'agit d'une technique qui utilise la technique "diviser pour régner" pour rechercher une clé.
La collection sur laquelle la recherche binaire doit être appliquée pour rechercher une clé doit être triée par ordre croissant.
En général, la plupart des langages de programmation prennent en charge les techniques de recherche linéaire, de recherche binaire et de hachage, qui sont utilisées pour rechercher des données dans la collection. Nous apprendrons le hachage dans nos prochains tutoriels.
Recherche binaire en Java
La recherche linéaire est une technique de base qui consiste à parcourir le tableau de manière séquentielle et à comparer chaque élément à la clé jusqu'à ce que la clé soit trouvée ou que la fin du tableau soit atteinte.
La recherche linéaire est rarement utilisée dans les applications pratiques. La recherche binaire est la technique la plus fréquemment utilisée car elle est beaucoup plus rapide que la recherche linéaire.
Java propose trois façons d'effectuer une recherche binaire :
- Utiliser l'approche itérative
- Utiliser une approche récursive
- Utilisation de la méthode Arrays.binarySearch ().
Dans ce tutoriel, nous mettrons en œuvre et discuterons de ces trois méthodes.
Algorithme de recherche binaire en Java
Dans la méthode de recherche binaire, la collection est divisée plusieurs fois en deux et l'élément clé est recherché dans la moitié gauche ou droite de la collection, selon que la clé est inférieure ou supérieure à l'élément central de la collection.
Un algorithme simple de recherche binaire est le suivant :
- Calculer l'élément médian de la collection.
- Comparez les éléments clés avec l'élément intermédiaire.
- Si clé = élément central, nous renvoyons la position de l'indice central pour la clé trouvée.
- Else If key> ; mid element, then the key lies in the right half of the collection. Répétez donc les étapes 1 à 3 sur la moitié inférieure (droite) de la collection.
- Si key <; mid element, la clé se trouve dans la moitié supérieure de la collection. Il faut donc répéter la recherche binaire dans la moitié supérieure.
Comme vous pouvez le voir dans les étapes ci-dessus, dans la recherche binaire, la moitié des éléments de la collection sont ignorés juste après la première comparaison.
Notez que la même séquence d'étapes s'applique à la recherche binaire itérative et récursive.
Illustrons l'algorithme de recherche binaire à l'aide d'un exemple.
Par exemple, prenons le tableau trié suivant de 10 éléments.
Calculons la position centrale du tableau.
Milieu = 0+9/2 = 4
#1) Clé = 21
Tout d'abord, nous comparons la valeur de la clé avec l'élément [mid] et nous constatons que la valeur de l'élément à mid = 21.
Nous constatons donc que la clé = [mid], ce qui signifie que la clé se trouve à la position 4 du tableau.
#2) Clé = 25
Nous comparons d'abord la valeur de la clé à la valeur moyenne. Comme (21 <; 25), nous recherchons directement la clé dans la moitié supérieure du tableau.
Nous allons maintenant trouver le milieu de la moitié supérieure du tableau.
Milieu = 4+9/2 = 6
La valeur à l'emplacement [mid] = 25
Nous comparons maintenant l'élément clé avec l'élément central, soit (25 == 25), ce qui signifie que nous avons trouvé la clé à l'emplacement [central] = 6.
La recherche binaire est plus efficace en termes de temps et d'exactitude, et elle est également beaucoup plus rapide.
Implémentation de la recherche binaire en Java
En utilisant l'algorithme ci-dessus, mettons en œuvre un programme de recherche binaire en Java en utilisant l'approche itérative. Dans ce programme, nous prenons un tableau d'exemple et effectuons une recherche binaire sur ce tableau.
import java.util.* ; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35} ; System.out.println("The input array : " + Arrays.toString(numArray)) ; //clé à rechercher int key = 20 ; System.out.println("\nKey to be searched=" + key) ; //set first to first index int first = 0 ; //set last to last elements in array int last=numArray.length-1 ; //calculate mid of thearray int mid = (first + last)/2 ; //pendant que first et last ne se chevauchent pas while( first <= last ){ //si la clé mid <;, alors la clé à rechercher se trouve dans la première moitié du tableau if ( numArray[mid] last ){ System.out.println("Element is not found !") ; } } }
Sortie :
Le tableau d'entrée : [5, 10, 15, 20, 25, 30, 35]
Clé à rechercher=20
L'élément se trouve à l'index 3
Le programme ci-dessus montre une approche itérative de la recherche binaire. Initialement, un tableau est déclaré, puis une clé à rechercher est définie.
Après avoir calculé le milieu du tableau, la clé est comparée à l'élément central. Ensuite, selon que la clé est inférieure ou supérieure à la clé, la clé est recherchée dans la moitié inférieure ou supérieure du tableau, respectivement.
Recherche binaire récursive en Java
Vous pouvez également effectuer une recherche binaire à l'aide de la technique de récursivité. Dans ce cas, la méthode de recherche binaire est appelée de manière récurrente jusqu'à ce que la clé soit trouvée ou que la liste entière soit épuisée.
Le programme qui met en œuvre une recherche binaire récursive est donné ci-dessous :
import java.util.* ; class Main{ //méthode récursive pour la recherche binaire public static int binary_Search(int intArray[], int low, int high, int key){ //si le tableau est en ordre, effectuer une recherche binaire sur le tableau if (high>=low){ //calculer mid int mid = low + (high - low)/2 ; //si key =intArray[mid] return mid if (intArray[mid] == key){ return mid ; } //si intArray[mid]> ; key then key is in leftmoitié du tableau if (intArray[mid]> ; key){ return binary_Search(intArray, low, mid-1, key);//recursively search for key }else //key is in right half of the array { return binary_Search(intArray, mid+1, high, key);//recursively search for key } return -1 ; } public static void main(String args[]){ //define array and key intArray[] = {1,11,21,31,41,51,61,71,81,91} ; System.out.println("InputListe : " + Arrays.toString(intArray)) ; int key = 31 ; System.out.println("\nLa clé à rechercher :" + clé) ; int high=intArray.length-1 ; //appeler la méthode de recherche binaire int result = binary_Search(intArray,0,high,clé) ; //imprimer le résultat if (result == -1) System.out.println("\nLa clé n'a pas été trouvée dans la liste donnée !") ; else System.out.println("\nLa clé a été trouvée à l'endroit : "+résult + " dans la liste") ; } } }.
Sortie :
Liste des entrées : [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
La clé à rechercher :
La clé se trouve à l'emplacement : 3 dans la liste
Utilisation de la méthode Arrays.binarySearch ().
La classe Arrays de Java fournit une méthode "binarySearch ()" qui effectue une recherche binaire sur le tableau donné. Cette méthode prend le tableau et la clé à rechercher comme arguments et renvoie la position de la clé dans le tableau. Si la clé n'est pas trouvée, la méthode renvoie -1.
L'exemple ci-dessous met en œuvre la méthode Arrays.binarySearch ().
import java.util.Arrays ; class Main{ public static void main(String args[]){ //définir un tableau intArray[] = {10,20,30,40,50,60,70,80,90} ; System.out.println("The input Array : " + Arrays.toString(intArray)) ; //définir la clé à rechercher int key = 50 ; System.out.println("\nLa clé à rechercher :" + key) ; //appeler la méthode binarySearch sur le tableau donné avec la clé à rechercher int result =Arrays.binarySearch(intArray,key) ; //imprime le résultat du retour if (result <; 0) System.out.println("\nKey is not found in the array !") ; else System.out.println("\nKey is found at index : "+result + " in the array.") ; } }
Sortie :
Le tableau d'entrée : [10, 20, 30, 40, 50, 60, 70, 80, 90].
La clé à rechercher:50
La clé se trouve à l'index 4 du tableau.
Questions fréquemment posées
Q #1) Comment écrire une recherche binaire ?
Réponse : Si la clé à rechercher est supérieure à l'élément central, la moitié supérieure du tableau est parcourue en divisant et en parcourant le sous-réseau jusqu'à ce que la clé soit trouvée.
De même, si la clé est inférieure à l'élément central, elle est recherchée dans la moitié inférieure du tableau.
Q #2) Où la recherche binaire est-elle utilisée ?
Réponse : La recherche binaire est principalement utilisée pour rechercher des données triées dans des applications logicielles, en particulier lorsque l'espace mémoire est compact et limité.
Q #3) Quel est le grand O de la recherche binaire ?
Réponse : La complexité temporelle de la recherche binaire est O (logn) où n est le nombre d'éléments du tableau. La complexité spatiale de la recherche binaire est O (1).
Q #4) La recherche binaire est-elle récursive ?
Réponse : Oui, puisque la recherche binaire est un exemple de stratégie "diviser pour régner" et qu'elle peut être mise en œuvre à l'aide de la récursivité, nous pouvons diviser le tableau en deux moitiés et appeler la même méthode pour effectuer la recherche binaire encore et encore.
Q #5) Pourquoi parle-t-on de recherche binaire ?
Réponse : L'algorithme de recherche binaire utilise une stratégie de division et de conquête qui coupe de façon répétée le tableau en deux parties, d'où son nom de recherche binaire.
Conclusion
La recherche binaire est la technique de recherche la plus fréquemment utilisée en Java. Pour qu'une recherche binaire puisse être effectuée, les données doivent être triées par ordre croissant.
Une recherche binaire peut être mise en œuvre en utilisant une approche itérative ou récursive. La classe Arrays de Java fournit également la méthode "binarySearch" qui effectue une recherche binaire sur un tableau.
Dans nos prochains tutoriels, nous explorerons différentes techniques de tri en Java.