Bonjour ! Bienvenue dans cette nouvelle leçon. Nous allons maintenant passer de la théorie à la pratique et construire ensemble un des algorithmes les plus élégants et efficaces qui soient.
Introduction
Dans la leçon précédente, nous avons répondu à une question cruciale : pourquoi la recherche dichotomique exige-t-elle un tableau trié ? Vous avez compris que c'est cette condition qui nous permet d'exploiter une stratégie de "diviser pour régner", en éliminant la moitié de l'espace de recherche à chaque étape.
Aujourd'hui, nous allons nous concentrer sur le comment. L'objectif est de formaliser cette logique et de l'implémenter sous forme d'algorithme. Vous apprendrez à manipuler les variables et les structures de contrôle pour traduire cette idée puissante en instructions concrètes. À la fin de cette leçon, vous serez capable d'écrire l'algorithme de recherche dichotomique en pseudo-code.
1. La mécanique de la recherche dichotomique
Pour implémenter la recherche dichotomique, nous avons besoin de suivre l'évolution de notre "zone de recherche" à l'intérieur du tableau. Pour cela, nous utilisons trois variables principales :
gauche(oudebut) : un "pointeur" qui marque l'indice du début de la zone de recherche. Au départ, c'est0.droite(oufin) : un pointeur qui marque l'indice de la fin de la zone de recherche. Au départ, c'est l'indice du dernier élément du tableau.milieu: l'indice de l'élément central de la zone de recherche actuelle.
L'algorithme se déroule dans une boucle. À chaque tour de boucle, on effectue les actions suivantes :
- On calcule l'indice du milieu :
milieu = (gauche + droite) // 2. On utilise la division entière//pour s'assurer d'obtenir un indice valide. - On compare l'élément à la position
milieuavec la valeur que l'on cherche. - Selon le résultat, on ajuste les pointeurs
gaucheoudroitepour réduire la zone de recherche.
La recherche s'arrête dans deux cas :
- Succès : On a trouvé l'élément.
- Échec : Le pointeur
gauchedevient plus grand que le pointeurdroite(gauche > droite). Cela signifie que la zone de recherche est devenue vide, et donc que l'élément n'est pas dans le tableau.
2. Trace manuelle : suivre les variables
Rien de tel qu'une trace manuelle pour bien comprendre le mécanisme. La ressource suivante détaille un exemple pas à pas. Reprenons l'exemple de la recherche de la valeur 40 que nous avions vu, mais cette fois-ci, portez une attention particulière à la mise à jour des variables g, d et c.
L'article "Algo Dichotomie - Infoforall" illustre parfaitement comment les pointeurs de début (g), de fin (d) et du centre (c) évoluent. Suivez attentivement les calculs et les nouvelles valeurs de ces indices à chaque étape.
Lisez la section "2 - Principe de la recherche dichotomique" du début jusqu'à la "Conclusion : 40 n'appartient pas à notre tableau.". Observez comment, après chaque comparaison, soit g soit d est recalculé pour réduire l'intervalle de recherche.
Pour visualiser l'ensemble du processus en un coup d'œil, l'image ci-dessous retrace la recherche de la valeur 35 dans un autre tableau.

3. Formalisation en pseudo-code
Maintenant que nous avons une vision claire du déroulement, nous pouvons le structurer en un algorithme formel. Le pseudo-code permet de décrire la logique sans se soucier de la syntaxe d'un langage de programmation spécifique.
La ressource suivante présente l'algorithme de recherche dichotomique en pseudo-code.
Nous allons maintenant étudier la structure formelle de l'algorithme. L'article "Algo Dichotomie - Infoforall" fournit un excellent pseudo-code que nous allons analyser.
Lisez la sous-section "Algorithme de recherche dichotomique". Concentrez-vous sur la structure : l'initialisation des variables (r, g, d), la condition de la boucle TANT QUE, et la structure SI...SINON SI...SINON à l'intérieur.
Analysons ensemble ce pseudo-code :
FONCTION recherche_dicho(t, x)
// Entrées : t (tableau trié), x (élément cherché)
// Sortie : indice de x dans t, ou -1 si non trouvé
r ← -1 // 'r' pour résultat. Initialisé à -1 (non trouvé)
g ← 0 // 'g' pour gauche. Pointeur de début.
d ← longueur(t) - 1 // 'd' pour droite. Pointeur de fin.
// La boucle continue tant que la zone de recherche est valide (g <= d)
// ET que l'élément n'a pas été trouvé (r == -1).
TANT QUE (g <= d) ET (r == -1)
c ← (g + d) // 2 // 'c' pour centre. Calcul du milieu.
SI t[c] < x
// L'élément cherché est dans la moitié droite
g ← c + 1
SINON SI t[c] > x
// L'élément cherché est dans la moitié gauche
d ← c - 1
SINON
// t[c] == x : On a trouvé l'élément !
r ← c // On stocke l'indice et on sortira de la boucle.
FIN SI
FIN TANT QUE
RETOURNER r // Retourne l'indice trouvé, ou -1 si la boucle s'est terminée sans trouver x.
Ce pseudo-code est le cœur de ce que vous devez retenir. Il est la traduction directe de la logique que nous avons explorée.
Pour voir à quoi cela pourrait ressembler dans un langage de programmation réel, vous pouvez consulter la version itérative en Python dans la ressource suivante.
Recherche Dichotomique en Python : Implémentation et Analyse
Cet article de Rachid Saad Academy présente une implémentation très claire de l'algorithme itératif en Python. C'est une bonne illustration de la traduction du pseudo-code en code fonctionnel.
Consultez la section "2.1 Version itérative de l'algorithme". Comparez le code Python avec le pseudo-code que nous venons d'étudier. Vous retrouverez les mêmes variables (gauche, droite, milieu) et la même logique de boucle while.
4. À vous de jouer !
La meilleure façon d'assimiler un algorithme est de l'exécuter soi-même. Prenez un papier et un crayon.
Exercice :
Soit le tableau trié suivant : T = [11, 23, 25, 38, 42, 57, 61, 74, 80, 89, 95].
Tracez l'exécution de l'algorithme de recherche dichotomique pour trouver la valeur 80.
Pour chaque tour de boucle, notez les valeurs de g, d, et c, ainsi que la comparaison effectuée.
Cliquez ici pour voir la solution de la trace.
Recherche de 80 dans T = [11, 23, 25, 38, 42, 57, 61, 74, 80, 89, 95] (longueur 11)
-
Initialisation :
g= 0d= 10r= -1
-
Tour de boucle 1 :
- Condition
g <= d(0 <= 10) est vraie. c= (0 + 10) // 2 = 5.T[5]= 57.- Comparaison :
57 < 80. - Mise à jour :
g=c+ 1 = 6. - (Nouvel état :
g=6,d=10,r=-1)
- Condition
-
Tour de boucle 2 :
- Condition
g <= d(6 <= 10) est vraie. c= (6 + 10) // 2 = 8.T[8]= 80.- Comparaison :
80 == 80. - Mise à jour :
r=c= 8. - (Nouvel état :
g=6,d=10,r=8)
- Condition
-
Tour de boucle 3 :
- La condition
r == -1est maintenant fausse. La boucleTANT QUEs'arrête.
- La condition
-
Fin :
- L'algorithme retourne la valeur de
r, qui est8.
- L'algorithme retourne la valeur de
Résultat : L'élément 80 a été trouvé à l'indice 8.
Conclusion
Félicitations ! Vous avez franchi une étape majeure aujourd'hui. Non seulement vous comprenez la logique de la recherche dichotomique, mais vous êtes maintenant capable de la formaliser et de la tracer.
Points clés à retenir :
- L'algorithme de recherche dichotomique s'implémente à l'aide de trois pointeurs d'indice :
gauche,droite, etmilieu. - Une boucle
TANT QUEgère le processus de recherche, qui continue tant que la zone de recherche (gauche <= droite) est valide. - À chaque itération, la zone de recherche est divisée par deux en mettant à jour soit le pointeur
gauche, soit le pointeurdroite, en fonction de la comparaison avec l'élément central. - L'algorithme se termine soit par la découverte de l'élément, soit lorsque la zone de recherche devient vide, indiquant que l'élément est absent.
Et après ?
Nous avons maintenant étudié deux algorithmes de recherche : la recherche linéaire (simple mais potentiellement lente) et la recherche dichotomique (très rapide mais nécessitant un tableau trié). Cette dernière nous amène naturellement à un autre sujet fondamental de l'algorithmique : le tri.
Dans la prochaine leçon, nous allons commencer à explorer les algorithmes de tri. Nous débuterons avec l'un des plus intuitifs : le tri par sélection. Vous découvrirez comment organiser un tableau en désordre pour pouvoir, par la suite, y effectuer des recherches efficaces.