Menu
Coddy logo textTech

Recherche dichotomique

Dernière mise à jour

La recherche dichotomique (ou recherche binaire) trouve une valeur cible dans un tableau **trié** en divisant la fenêtre de recherche par deux à chaque étape. Elle compare l'élément du milieu à la cible : en cas d'égalité, la recherche se termine ; sinon, la moitié qui ne peut pas contenir la cible est écartée et la fenêtre se réduit à l'autre moitié. Chaque comparaison élimine la moitié des éléments restants, c'est pourquoi elle s'exécute en O(log n) — chercher parmi un million de valeurs triées demande au plus une vingtaine de comparaisons.

L'animation ci-dessus montre les pointeurs lo, mid et hi et estompe la moitié éliminée après chaque comparaison. La seule précondition non négociable : le tableau doit déjà être trié — sur des données non triées, il faut la recherche linéaire ou d'abord un tri (voir le tri fusion). La même idée de division par deux est au cœur de l'arbre binaire de recherche.

Complexité en temps et en espace

CasComplexitéRemarques
Meilleur casO(1)L'élément du milieu est la cible dès la première comparaison.
Cas moyenO(log n)Chaque comparaison divise par deux la fenêtre restante.
Pire casO(log n)La fenêtre se réduit à un seul élément avant de trouver ou d'échouer.
EspaceO(1)La version itérative ne conserve que les indices lo, hi et mid.

Étape par étape

ÉtapeCe qui se passe
1Initialisez lo au premier indice et hi au dernier indice du tableau trié.
2Calculez l'indice du milieu : mid = (lo + hi) // 2.
3Si a[mid] est égal à la cible, renvoyez mid — trouvé.
4Si a[mid] est **inférieur** à la cible, la cible ne peut être que dans la moitié droite : posez lo = mid + 1.
5Si a[mid] est **supérieur** à la cible, cherchez dans la moitié gauche : posez hi = mid - 1.
6Répétez à partir de l'étape 2 tant que lo <= hi ; si la fenêtre se vide, la cible n'est pas dans le tableau.

Exemple détaillé

Recherche de 5 dans [1, 2, 3, 5, 7, 8, 9] :

PassageFenêtre (lo..hi)mida[mid]Action
1[1, 2, 3, 5, 7, 8, 9] (0..6)35a[3] = 5 — cible trouvée à l'indice 3.

Un échec, étape par étape

Chercher 4 dans le même tableau montre comment la fenêtre se vide :

PassageFenêtre (lo..hi)mida[mid]Action
10..6355 > 4 — cherchez dans la moitié gauche, hi = 2.
20..2122 < 4 — cherchez dans la moitié droite, lo = 2.
32..2233 < 4lo devient 3, la fenêtre se vide : introuvable.

Quand utiliser la recherche dichotomique

À utiliser quandÀ éviter quand
Les données sont déjà triées (ou vous y cherchez de nombreuses fois)Les données ne sont pas triées et ne sont cherchées qu'une seule fois — trier d'abord coûte O(n log n)
La collection permet un accès direct rapide (tableaux)Vous n'avez qu'un accès séquentiel (listes chaînées)
Le jeu de données est grand — O(log n) brille à grande échelleLe jeu de données est minuscule — un simple parcours est tout aussi rapide et plus simple

Une implémentation propre et exécutable de Binary Search en Python, JavaScript, Java, C++, C, Pseudocode. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Binary Search en Python

Python
1def binary_search(a, target):2    lo, hi = 0, len(a) - 13    while lo <= hi:4        mid = (lo + hi) // 25        if a[mid] == target:6            return mid7        if a[mid] < target:8            lo = mid + 1  # search the right half9        else:10            hi = mid - 1  # search the left half11    return -112
13
14nums = [1, 2, 3, 5, 7, 8, 9]  # must be sorted15print("Index of 5:", binary_search(nums, 5))16print("Index of 4:", binary_search(nums, 4))
Exécutez ce code dans le Playground Python

FAQ sur la recherche dichotomique

Quelle est la complexité en temps de la recherche dichotomique ?
O(log n) dans les cas moyen et pire, car chaque comparaison divise par deux la fenêtre de recherche restante, et O(1) dans le meilleur cas, quand le premier élément du milieu est la cible. La version itérative utilise O(1) d'espace supplémentaire.
Pourquoi la recherche dichotomique exige-t-elle un tableau trié ?
L'étape de division par deux repose sur l'ordre : comparer la cible à l'élément du milieu n'indique quelle moitié écarter que si tout ce qui est à gauche du milieu est plus petit et tout ce qui est à droite est plus grand. Sur des données non triées, cette déduction n'est pas valable — utilisez plutôt la recherche linéaire, ou triez d'abord.
Quelle est la différence entre la recherche dichotomique et la recherche linéaire ?
La recherche linéaire parcourt les éléments un par un (O(n)) et fonctionne sur n'importe quel tableau ; la recherche dichotomique divise par deux la fenêtre de recherche d'un tableau trié (O(log n)) mais exige une entrée triée. Pour une poignée d'éléments, la différence est négligeable — à grande échelle, la recherche dichotomique l'emporte nettement.
Combien de comparaisons la recherche dichotomique nécessite-t-elle ?
Au plus environ log2(n) + 1 : 10 comparaisons couvrent 1 000 éléments, 20 comparaisons en couvrent 1 000 000. Cette croissance logarithmique en fait la recherche par défaut sur des données triées.
Quel est le célèbre bug de dépassement dans la recherche dichotomique ?
Calculer le milieu avec (lo + hi) / 2 peut faire déborder des entiers de taille fixe lorsque lo + hi dépasse le maximum du type. La forme sûre est mid = lo + (hi - lo) / 2. En Python cela n'a pas d'importance (entiers à précision arbitraire), mais en Java/C/C++ c'est un bug réel et célèbre.
La recherche dichotomique est-elle la même chose qu'un arbre binaire de recherche ?
Ils partagent l'idée de division par deux mais diffèrent par leur structure : la recherche dichotomique est un algorithme sur un tableau trié, tandis qu'un arbre binaire de recherche est une structure de données chaînée qui garde ses clés ordonnées, de sorte que les recherches descendent à gauche ou à droite à chaque nœud.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER