Chercher un élément dans une liste peut être très long.
Y a-t-il des méthodes plus rapides ?
L'algorithme de recherche dichotomique fonctionne comme suit :
Observe l'animation ci-contre : à chaque comparaison, la moitié de la plage de recherche disparaît.
d = début de la plage, m = milieu, f = fin de la plage
Clique sur « Démarrer / Redémarrer » pour lancer l'animation.
À faire dans le cahier.
On considère la liste suivante : [3, 5, 8, 12, 15, 19, 23, 35, 42, 56, 60, 67, 70, 78, 91]
En faisant une recherche dichotomique :
Compléter la fonction ci-dessous qui implémente une recherche dichotomique :
Une liste est donnée afin de tester la fonction.
On considère la boucle qui manipule les indices gauche et droite.
Invariant : À chaque itération, si l’élément recherché est présent dans le tableau, alors il se trouve dans l’intervalle d’indices \( [gauche, droite] \).
Au début de l’algorithme, on a :
\( gauche = 0 \) et \( droite = n - 1 \).
L’intervalle \( [gauche, droite] \) contient donc tout le tableau. L’invariant est vrai avant la première itération.
À chaque itération, on calcule l’indice milieu et on compare la valeur recherchée avec tab[milieu].
tab[milieu] est égal à la valeur recherchée, l’algorithme renvoie immédiatement True.droite = milieu - 1.gauche = milieu + 1.Dans chaque cas, on élimine une moitié du tableau qui ne peut pas contenir la valeur recherchée. L’invariant reste donc vrai après chaque itération.
La boucle s’arrête lorsque gauche > droite.
Dans ce cas, l’intervalle \( [gauche, droite] \) est vide. D’après l’invariant, la valeur recherchée ne peut donc pas être présente dans le tableau.
Si l’algorithme renvoie True, la valeur est bien dans le tableau.
S’il termine sans la trouver, alors elle n’y est pas.
La recherche dichotomique est donc un algorithme correct, à condition que le tableau soit trié.