edubun
Français

Chercher : recherche linéaire et recherche dichotomique

Pour trouver un nom dans une liste triée d'un million de noms, la recherche dichotomique n'a jamais besoin de plus de 20 vérifications.

Chercher une valeur

La recherche consiste à trouver où se trouve une valeur dans une collection, ou à apprendre qu'elle n'y est pas. Ton téléphone le fait quand tu tapes le nom d'un contact, une boutique le fait quand elle vérifie si un article est en stock, et un correcteur orthographique le fait pour chaque mot que tu tapes. L'entrée est une liste et une valeur cible. La sortie est la position de la cible, ou un signe comme -1 qui veut dire « introuvable ».

La recherche linéaire : une valeur à la fois

La méthode la plus simple consiste à partir de la gauche et à vérifier chaque valeur à tour de rôle jusqu'à trouver la cible ou arriver au bout de la liste. C'est la recherche linéaire (ou séquentielle). Elle fonctionne sur n'importe quelle liste, triée ou non. Son coût dépend de la chance : si la cible est en premier, une vérification suffit ; si elle est en dernier ou absente, on vérifie toutes les valeurs. Pour une liste de n valeurs, le pire cas est n vérifications. Une liste deux fois plus longue peut demander deux fois plus de vérifications, d'où le nom « linéaire » : le travail augmente en ligne droite avec la taille.

function linearSearch(list, target) {
  for (let i = 0; i < list.length; i++) {
    if (list[i] === target) return i;  // trouvée
  }
  return -1;                             // tout a été vérifié
}

La recherche dichotomique : couper en deux ce qui reste

Si la liste est triée, on peut faire bien mieux. Pense au jeu du nombre à deviner : quelqu'un choisit un nombre de 1 à 100 et ne répond que « plus grand » ou « plus petit ». Un joueur malin propose d'abord 50. Quelle que soit la réponse, la moitié des possibilités disparaît. La proposition suivante est le milieu de ce qui reste, et ainsi de suite. La recherche dichotomique (ou binaire) fait exactement cela avec une liste triée. Elle garde deux repères, lo et hi, autour de la partie où la cible pourrait encore se trouver. Elle vérifie la valeur du milieu. Si c'est la cible, c'est fini. Si la valeur du milieu est plus petite que la cible, tout ce qui est à sa gauche est plus petit aussi : lo passe donc après le milieu. Si elle est plus grande, hi passe avant le milieu. Quand lo dépasse hi, il ne reste rien et la cible n'est pas dans la liste.

function binarySearch(list, target) {
  let lo = 0, hi = list.length - 1;
  while (lo <= hi) {
    const mid = Math.floor((lo + hi) / 2);
    if (list[mid] === target) return mid;
    if (list[mid] < target) lo = mid + 1;  // la cible est à droite
    else hi = mid - 1;                     // la cible est à gauche
  }
  return -1;
}
Chargement

Fais glisser pour tourner. Fais défiler ou pince pour zoomer.

Une liste triée de 31 nombres. Choisis une cible, puis avance pas à pas dans la recherche dichotomique et dans la recherche linéaire, et compare le nombre de vérifications.

Combien de vérifications ?

Chaque vérification de la recherche dichotomique divise au moins par deux la partie restante. En partant de n valeurs, il en reste au plus environ n/2 après une vérification, environ n/4 après deux, et ainsi de suite jusqu'à ce qu'il ne reste qu'une valeur. Le nombre de divisions par deux nécessaires pour passer de n à 1 est le logarithme de base 2 de n, noté log₂ n. En comptant aussi la dernière vérification, la recherche dichotomique demande au plus ⌊log₂ n⌋ + 1 vérifications, où ⌊ ⌋ signifie arrondir à l'entier inférieur. Pour 100 valeurs, cela fait 7 vérifications : c'est pourquoi on peut toujours gagner au jeu du nombre à deviner en 7 propositions. Pour 1000 valeurs, c'est 10, pour un million 20, et pour un milliard 30.

Taille de la liste nRecherche linéaire, pire casRecherche dichotomique, pire cas
773
1001007
1,0001,00010
1,000,0001,000,00020
1,000,000,0001,000,000,00030

Le piège : la liste doit être triée

La recherche dichotomique ne fonctionne que parce que, dans une liste triée, une seule comparaison indique de quel côté doit se trouver la cible. Dans une liste non triée, la valeur du milieu n'apprend rien sur ses voisines : on revient donc à la recherche linéaire. Trier demande aussi du travail (les deux unités suivantes en parlent) : le choix dépend donc de l'usage. Si tu cherches une seule fois dans une liste, une recherche linéaire est peut-être la moins coûteuse. Si tu cherches des milliers de fois dans la même liste, la trier une fois puis utiliser la recherche dichotomique devient vite rentable. Ce compromis entre la préparation des données et les réponses aux questions qu'on leur pose traverse toute la discipline.

Une erreur classique de la recherche dichotomique porte sur l'étape de mise à jour. Écrire lo = mid au lieu de lo = mid + 1 peut faire tourner la boucle indéfiniment quand il reste deux valeurs, car mid ne change jamais. La valeur du milieu a déjà été vérifiée : on peut donc l'exclure de l'intervalle suivant.
recherche linéaireVérifier les valeurs une par une depuis le début
recherche dichotomiqueVérifier le milieu d'un intervalle trié et écarter la moitié qui ne peut pas contenir la cible
pire casL'entrée qui fait le plus travailler l'algorithme
log₂ nCombien de fois on peut diviser n par deux avant d'atteindre 1
lo et hiLes deux bornes de l'intervalle où la cible pourrait encore se trouver
-1Une valeur de retour courante qui signifie « introuvable »
  1. Au plus combien de vérifications la recherche dichotomique demande-t-elle pour une liste triée de 1000 valeurs ?
  2. Au plus combien de vérifications la recherche linéaire demande-t-elle pour une liste de 1000 valeurs ?
  3. La recherche dichotomique exige que la liste soit
    • triée
    • courte
    • composée de nombres entiers
    • sans valeurs répétées
  4. Dans la liste [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], combien de vérifications la recherche dichotomique fait-elle pour trouver 23 ?
  5. Dans la même liste, combien de vérifications la recherche linéaire fait-elle pour trouver 23 ?
  6. La recherche dichotomique vérifie une valeur du milieu égale à 40 en cherchant 25. Que se passe-t-il ensuite ?
    • hi passe juste avant le milieu
    • lo passe juste après le milieu
    • la recherche s'arrête : 25 est absent
    • elle vérifie la valeur suivante à droite
  7. Tu dois deviner un nombre de 1 à 100, et on te répond « plus grand » ou « plus petit ». Avec la meilleure stratégie, combien de propositions suffisent toujours ?
  8. Une liste double de taille. Que devient le nombre de vérifications de la recherche dichotomique dans le pire cas ?
    • Il double
    • Il augmente d'environ un
    • Il reste exactement le même
    • Il est élevé au carré
  9. Tu vas chercher une seule valeur, une seule fois, dans une liste non triée. Qu'est-ce qui coûte le moins ?
    • La recherche linéaire
    • Trier la liste, puis faire une recherche dichotomique
  10. Pourquoi lo = mid (au lieu de mid + 1) peut-il faire tourner la recherche dichotomique indéfiniment ?
    • Quand il reste deux valeurs, mid peut rester le même à chaque tour
    • mid devient négatif
    • JavaScript ne l'autorise pas
    • La liste s'allonge
  11. Au plus combien de vérifications la recherche dichotomique demande-t-elle pour 1000000 valeurs ?
L'essentiel
  • La recherche linéaire vérifie une valeur à la fois : jusqu'à n vérifications.
  • La recherche dichotomique coupe en deux l'intervalle restant : jusqu'à ⌊log₂ n⌋ + 1 vérifications.
  • La recherche dichotomique ne fonctionne que sur une liste triée.
  • Un million de valeurs : 20 vérifications au plus.
  • Mets à jour avec mid + 1 et mid − 1 pour que l'intervalle rétrécisse toujours.
Sources de ce cours (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Consulté le: 2026-10-17