Première · Algorithmique

La recherche dichotomique

Pour trouver un nombre dans une liste triée, faut-il lire toutes les cases ? Une comparaison au milieu permet d’écarter une moitié entière. La puissance de la dichotomie repose sur cette information collective, et non sur la seule vitesse d’une comparaison.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Exécuter une dichotomie dans un tableau trié.
  • Mettre à jour des bornes inclusives sans oublier de case.
  • Justifier la terminaison et comprendre le coût logarithmique.
Les bases utiles pour commencer

La condition qui autorise à éliminer une moitié

Le tableau doit être trié dans l’ordre croissant. Si sa valeur centrale est inférieure à la cible, toutes les valeurs placées à gauche sont également trop petites. On peut donc éliminer cette partie sans lire chaque case. Si la valeur centrale est supérieure, on élimine la partie droite. Sans tri, cette déduction serait fausse.

La dichotomie peut renvoyer un indice ou signaler l’absence. Dans la version étudiée, plusieurs occurrences égales peuvent conduire à n’importe laquelle d’entre elles. Trouver spécialement la première occurrence demanderait une adaptation ; ce n’est pas une garantie implicite de la recherche.

La déduction élimine des indices grâce à l’ordre des valeurs. Si le milieu contient 17 et la cible vaut 21, toute case d’indice inférieur ou égal au milieu contient au plus 17 et ne peut convenir. On n’affirme pas que ces valeurs sont inconnues ou inutiles en général : elles deviennent impossibles pour cette cible précise. Chaque déplacement de borne doit pouvoir se justifier par cette implication.

Définir précisément les bornes

Nous utilisons deux indices inclusifs g et d : toutes les cases de g à d sont encore candidates. Initialement, g vaut 0 et d vaut n - 1. Le milieu est la partie entière de (g + d) / 2. Si la cible est plus grande que t[m], la nouvelle borne gauche vaut m + 1, puisque la case centrale a déjà été écartée.

Si la cible est plus petite, d devient m - 1. Quand g dépasse d, l’intervalle ne contient plus de case. Ce n’est pas une anomalie : c’est la situation normale permettant de conclure que la cible est absente.

def dichotomie(t, cible):
    g, d = 0, len(t) - 1
    while g <= d:
        m = (g + d) // 2
        if t[m] == cible:
            return m
        if t[m] < cible:
            g = m + 1
        else:
            d = m - 1
    return -1

Un intervalle qui rétrécit vraiment

Tant que la boucle continue, le nombre de cases candidates est d - g + 1. Ce nombre entier positif diminue strictement après chaque comparaison non concluante. Il constitue un variant de boucle : la recherche ne peut donc pas continuer indéfiniment. Écrire g = m pourrait empêcher cette diminution lorsque le milieu est déjà égal à g.

La propriété conservée est différente : si la cible apparaît dans le tableau, une occurrence reste dans la zone candidate tant qu’elle n’a pas été trouvée. La terminaison prouve l’arrêt ; cette propriété explique pourquoi une moitié peut être éliminée sans perdre une solution.

Au départ d’un tableau vide, g=0 et d=-1. La condition de boucle est fausse avant le moindre accès, et le résultat est -1. Sur un singleton, une seule visite décide soit du succès, soit de l’intervalle vide. Ces cas sont courts à dérouler et particulièrement efficaces pour repérer les erreurs sur < et <=.

Mesurer la réduction plutôt que réciter une formule

Après une étape, il reste environ la moitié des cases, puis le quart, puis le huitième. Pour 16 valeurs, cette version effectue au plus 5 visites de milieu, selon la cible et les arrondis. Pour un tableau non vide de taille n, cette borne est la partie entière de log₂(n) plus 1.

Le coût est logarithmique en nombre de visites. Il suppose notamment un accès direct aux cases. Trier au préalable un tableau uniquement pour une recherche ajoute un coût qu’il ne faut pas oublier. La comparaison avec une recherche séquentielle dépend donc du contexte et du nombre de recherches à effectuer.

Deux recherches proches, deux conclusions différentes

Sur [2,5,8,12], cherchons 8. Les bornes initiales sont 0 et 3, donc le milieu vaut 1 et contient 5. On garde les indices 2 à 3 ; le milieu vaut 2 et l’égalité donne le résultat 2. Cherchons maintenant 9 : les deux premières visites sont identiques, mais 8 est trop petit. Les bornes deviennent 3 et 3 ; on visite 12, puis la borne droite devient 2. La zone est vide.

Ces traces montrent qu’une case restante doit encore être visitée. Utiliser une boucle strictement g < d sans traitement final du singleton peut manquer une cible. Pour contrôler votre tableau, notez les bornes avant la visite, le milieu et la décision. Les bornes suivantes doivent exclure exactement la partie démontrée impossible, y compris le milieu lorsqu’il n’est pas égal à la cible.

Choisir la méthode selon le contexte

Si un tableau de mesures non triées ne sera interrogé qu’une fois, une recherche séquentielle peut suffire. Trier puis chercher ajoute un traitement préalable et peut modifier l’ordre des données. Si un catalogue trié reçoit de nombreuses requêtes, on peut au contraire exploiter son ordre à chaque recherche. Le coût total dépend donc de la préparation, du nombre de requêtes et des éventuelles mises à jour.

Le résultat standard n’est pas forcément la première occurrence. Dans [1,4,4,4,9], la première visite peut trouver l’indice 2 alors que le premier 4 est à l’indice 1. C’est correct si le contrat demande une occurrence quelconque. Trouver la première demande de conserver un résultat provisoire et de poursuivre vers la gauche, ce qui constitue une variante à spécifier. Ne corrigez pas un programme qui respecte son contrat en lui attribuant une exigence absente de l’énoncé.

À vous de faire varier les choses

Quelle moitié peut disparaître ?

Choisissez une cible, présente ou absente, et avancez les visites. Le tableau reste fixe et trié afin de rendre les bornes vérifiables.

Lire le résultat de l’expérience initiale

Recherche en cours

Bornes inclusives : après une comparaison sans égalité, le milieu testé quitte la zone candidate.

gdmt[m]Décision
015737Garder à droite

Chaque moitié écartée l’est grâce à une comparaison et à l’ordre du tableau.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · Appliquer#

Chercher 21

Dans [3, 8, 12, 17, 21, 28, 34], donnez les indices centraux visités pour chercher 21 avec le code fourni.

Indice 1

Le premier milieu est 3.

Indice 2

Après 17, la zone devient [4, 6].

Comprendre la correction

On visite 3, où se trouve 17, puis 5, où se trouve 28, puis 4, où se trouve 21. La recherche renvoie 4 après trois visites. Le résultat est un indice ; la valeur trouvée est 21.

Exercice 2 · Comprendre#

Une cible absente

Exécutez la recherche de 9 dans [2, 5, 8, 12]. Quelles sont les dernières bornes ?

Indice 1

Les milieux successifs sont 1, 2 puis 3.

Indice 2

Après la comparaison avec 12, la borne droite recule.

Comprendre la correction

Après 5 puis 8, g vaut 3. La valeur 12 est trop grande, donc d devient 2. Les dernières bornes sont g = 3 et d = 2 : la zone est vide. Le programme renvoie -1 sans tenter d’accéder à une case entre ces bornes.

Exercice 3 · Corriger#

Une boucle qui n’avance plus

Sur [2, 5], on cherche 5. Un programme utilise g = m au lieu de m + 1 lorsque t[m] est trop petit. Montrez le blocage.

Indice 1

Avec g = 0 et d = 1, m vaut 0.

Indice 2

Quelle affectation change réellement g ?

Comprendre la correction

Le milieu vaut toujours 0 et contient 2. L’affectation g = m conserve g = 0 ; d reste 1. La même comparaison se répète. Avec g = m + 1, g devient 1 et la prochaine visite trouve 5. Exclure le milieu testé garantit le progrès.

Exercice 4 · Justifier#

Peut-on chercher sans trier ?

Appliquer cette dichotomie à [1, 9, 3, 7] peut-il garantir de trouver 9 ? Expliquez la première décision.

Indice 1

Le milieu initial est 1.

Indice 2

Un exemple réussi ne prouve pas que la précondition est inutile.

Comprendre la correction

Dans cet exemple précis, la première case visitée contient 9 et la recherche réussit. Mais cela ne donne aucune garantie générale : chercher 3 éliminerait la droite après la comparaison avec 9, alors que 3 s’y trouve. Le tri est indispensable au raisonnement d’élimination, même si certains cas non triés réussissent par hasard.

Exercice 5 · Approfondir et transférer#

Une absence entre deux voisins

Cherchez 6 dans [1,3,5,7,9,11]. Donnez les indices visités, les bornes finales et le résultat renvoyé. Justifiez chaque moitié éliminée.

Indice 1

Le milieu utilise la division entière.

Indice 2

Le milieu déjà testé ne reste pas candidat.

Comprendre la correction

On visite 2 (valeur 5), puis 4 (9), puis 3 (7). Les bornes passent de [0,5] à [3,5], puis [3,3], puis [3,2]. La cible est absente et le résultat est -1. Les valeurs éliminées sont soit toutes trop petites, soit toutes trop grandes grâce au tri.

Exercice 6 · Approfondir et transférer#

Le singleton oublié

Une variante boucle seulement tant que g < d, puis renvoie -1 sans autre test. Déroulez-la sur [2,5] en cherchant 5. Proposez une correction cohérente avec les bornes inclusives et vérifiez-la aussi sur un tableau vide.

Indice 1

La première visite met la borne gauche à 1.

Indice 2

Une zone d’une case n’est pas vide.

Comprendre la correction

Après la comparaison avec 2, les bornes valent toutes deux 1. La boucle stricte s’arrête sans lire 5 et renvoie à tort -1. Remplacer sa condition par g <= d permet la seconde visite. Pour le vide, 0 est supérieur à -1 dès le départ, donc aucun accès n’a lieu.

Exercice 7 · Approfondir et transférer#

Dimensionner les visites

Un catalogue trié contient 31 valeurs distinctes. Avec la convention inclusive et le milieu arrondi vers le bas, donnez une borne du nombre de visites. Puis comparez à 32 valeurs et à une recherche séquentielle infructueuse de 32 valeurs. Expliquez le rôle des arrondis.

Indice 1

Une suite de divisions par deux atteint progressivement une seule case.

Indice 2

La borne vaut la partie entière de log₂(n), plus 1 pour n non nul.

Comprendre la correction

Pour 31 valeurs, au plus 5 visites ; pour 32, au plus 6. Une recherche séquentielle infructueuse lit les 32 valeurs. Passer une puissance de deux peut ajouter un niveau, car la division produit parfois un côté contenant une case de plus. La complexité logarithmique décrit la croissance, pas un quotient arrondi identique pour toutes les tailles.

Les erreurs qui méritent un détour

Utiliser des bornes inclusives avec une condition prévue pour des bornes exclusives.
Choisissez une convention et gardez-la dans l’initialisation, le test et les mises à jour.
Confondre variant et invariant.
Le variant diminue pour prouver l’arrêt ; l’invariant reste vrai pour justifier le résultat.

La fiche à garder

L’essentiel à retenir

  • La dichotomie exige un tableau trié.
  • Le milieu testé est exclu après un échec.
  • Une zone vide signifie que la cible est absente.

Cette notion au bac

Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.

Le prochain pas

Retrouver le catalogue de Première

Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.