Keyboard shortcuts

Touchez ← ou → pour naviguer les chapitres

Touchez S ou / pour chercher dans le livre

Touchez ? pour afficher ce message

Touchez Esc pour masquer ce message

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 contains ou binarySearch des 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 (et indexOf quand 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

recherche séquentielle

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

recherche binaire

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

© 2022-2025 David Crowley