Accueil > Structures de données et algorithmes >
đ Algorithmes de recherche classiques
Survol et attentes
Les développeurs sont appelés à trouver des solutions à de nouveaux problÚmes, souvent en créant un algorithme sur mesure pour la tùche.
Rechercher une valeur dans une liste est un problĂšme qui connaĂźt dĂ©jĂ plusieurs solutions. Ătudier certaines solutions de base vous aide, comme dĂ©veloppeur en herbe, Ă comprendre comment les algorithmes sont structurĂ©s et Ă voir le lien entre un algorithme et la structure de donnĂ©es sous-jacente.
Pour ces types de problÚmes, au quotidien, vous utiliserez généralement des solutions optimisées comme les méthodes
containsoubinarySearchdes différents objets de votre langage de programmation.
Définitions
Vous devrez comprendre deux algorithmes de recherche : la recherche séquentielle et la recherche binaire.
- Recherche séquentielle (ou linéaire)
- Une algorithme qui traverse la collection jusquâĂ ce quâil atteigne la valeur cherchĂ©e ou la fin de la collection. Des variantes incluent des algorithmes qui traversent toujours la collection entiĂšre pour trouver la position de toutes les correspondances avec la valeur cherchĂ©e.
- Recherche binaire
- Un algorithme qui divise une collection triĂ©e en 2 Ă chaque comparaison, arrĂȘtant quand la valeur cherchĂ©e se trouve au point milieu de la partie restante ou quand il ne reste plus dâitems Ă vĂ©rifier. Câest important de noter que la collection doit ĂȘtre triĂ©e pour que cet algorithme fonctionne.
Objectifs dâapprentissage
Ă la fin de cette leçon vous devrez ĂȘtre en mesure de :
- DiffĂ©rencier la recherche sĂ©quentielle avec la recherche binaire selon des descriptions, du pseudocode, des diagrammes ou des exemples dâimplĂ©mentation.
CritĂšres de succĂšs
- Je suis capable dâexpliquer un algorithme de recherche sĂ©quentielle ou binaire pour des tableaux.
- Je suis capable dâutiliser la mĂ©thode
contains(etindexOfquand elle est disponible) de collections comme les String, ArrayList, HashMap, etc. pour faire une recherche appliquant les algorithmes optimisés dans la bibliothÚque standard Java.
Notes
Recherche séquentielle / linéaire
Description
La recherche sĂ©quentielle est un algorithme qui traverse une collection jusquâĂ ce quâil atteigne la valeur cherchĂ©e ou la fin de la collection. Des variantes incluent des algorithmes qui traversent toujours la collection entiĂšre pour trouver la position de toutes les correspondances avec la valeur cherchĂ©e.
Pseudocode
RechercheSequentielle(liste, cible)
pour chaque élément dans la liste
si élément = cible
retourner vrai
retourner faux
Diagramme de flux

Exemple dâimplĂ©mentation Java
public static boolean sequentialSearch(int[] elements, int target) {
for (int i = 0; i < elements.length; i++) {
if (elements[i] == target) {
return true;
}
}
return false;
}
Recherche binaire
Description
La recherche binaire est un algorithme qui divise une collection triĂ©e en deux Ă chaque comparaison, arrĂȘtant quand la valeur cherchĂ©e se trouve au point milieu de la partie restante ou quand il ne reste plus dâitems Ă vĂ©rifier. Câest important de noter que la collection doit ĂȘtre triĂ©e pour que cet algorithme fonctionne.
Pseudocode
RechercheBinaire(liste, cible)
gauche = 0
droite = taille(liste) - 1
tant que gauche <= droite
milieu = (gauche + droite) / 2
si liste[milieu] = cible
retourner vrai
sinon si liste[milieu] < cible
gauche = milieu + 1
sinon
droite = milieu - 1
retourner faux
Diagramme de flux

Exemple dâimplĂ©mentation Java
public static boolean binarySearch(int[] elements, int target) {
int left = 0;
int right = elements.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (target == elements[mid]) {
return true;
} else if (target < elements[mid]) {
right = mid - 1;
} else { // target > elements[mid]
left = mid + 1;
}
}
return false;
}
Exercices
Revue interactive - CSAwesome
anglais
Vous pouvez trouvez des vidĂ©os explicatives, des exemples dâimplĂ©mentations Java et des exercices interactifs en lien avec ce sujet sur le site CS Awesome, notamment la section suivante :
Une recherche séquentielle/linéaire adaptée
CrĂ©er un algorithme de recherche sĂ©quentielle qui retourne TOUS les index des Ă©lĂ©ments identiques Ă la valeur recherchĂ©e. Si lâĂ©lĂ©ment nâest pas trouvĂ©, la liste retournĂ©e devrait ĂȘtre vide. Vous pouvez utiliser un ArrayList pour stocker les index trouvĂ©s.
La signature de la méthode serait alors :
public static ArrayList<Integer> sequentialSearch(int[] elements, int target)
Créez une classe Algos.java pour y mettre cette méthode.
Lancer les tests dans AlgosTest.java (clic-droit et âEnregistrer le lien sousâ pour enregistrer le fichier dans votre dossier de projet) pour vĂ©rifier votre implĂ©mentation. Suivre les Ă©tapes 1 Ă 4 pour ajouter JUnit Ă votre projet avant de lancer les tests.
Une méthode pour vérifier si un tableau est trié
CrĂ©er une autre mĂ©thode dans la classe Algos qui vĂ©rifie si un tableau dâentiers est triĂ© en ordre croissant. Cette condition est un prĂ©requis pour les algorithmes de recherche binaire.
La signature de la méthode serait :
public static boolean isSorted(int[] elements)
Il devrait retourner true si le tableau est trié et false sinon.
Ajoutez ces tests Ă votre fichier AlgoTest.java (voir la tĂąche prĂ©cĂ©dente), Ă lâintĂ©rieur de la classe existante. Mettre le document en forme aprĂšs le copier-coller pour vĂ©rifier que la structure a Ă©tĂ© maintenue durant lâopĂ©ration.
@Test
public void testIsSortedWithUnsorted() {
int[] a = { 2, 1, 3, 4, 5 };
assertEquals(false, Algos.isSorted(a));
}
@Test
public void testIsSortedWithEqual() {
int[] a = { 1, 1, 1, 1, 1 };
assertEquals(true, Algos.isSorted(a));
}
@Test
public void testIsSortedWithSorted() {
int[] a = { 1, 2, 3, 4, 5 };
assertEquals(true, Algos.isSorted(a));
}