Prepa Help
Prepa Help › Cours › Informatique, 1re année

Listes et recherche dichotomique en Python : cours et exercices corrigés

Listes Python : création, indexation, tranches, mutabilité et alias, compréhensions, listes de listes ; algorithmes de parcours (somme, maximum, comptage), recherche séquentielle d'un élément, recherche dichotomique dans une liste triée, avec terminaison, correction et coût.

Les nombres sont ceux du chapitre complet ; chaque filière voit la partie qui correspond à son programme.

La recherche dichotomique cherche une valeur dans une liste triée en la comparant à l'élément du milieu, puis en ne gardant que la moitié qui peut la contenir : au plus ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1 tours, soit 20 pour un million d'éléments, quand la recherche séquentielle en fait jusqu'à nn. Ce chapitre d'informatique commune de première année, au programme de MPSI, PCSI, PTSI, TSI et TPC, au Maroc et en France, traite d'abord les listes Python : création, indices, tranches, alias et copies, listes de listes ; puis les parcours (somme, maximum, second maximum, comptage) et les deux recherches, avec leur variant, leur invariant et leur coût en O(n)O(n) ou en O(log⁡n)O(\log n). Les exercices reprennent des questions des sujets du CNC, de CCINP, de Mines-Ponts et de X-ENS. La recherche d'un zéro d'une fonction par dichotomie, au programme de TSI et de TPC en France, y est traitée aussi.

Ce que tu sauras faire

Une liste range sous un seul nom des valeurs numérotées : les pesées d'une journée, les numéros des lots d'un registre, les cases d'une grille. Chercher une valeur dans une liste est l'une des tâches les plus fréquentes d'un programme, et presque tous les sujets d'informatique commencent par là. À la fin de ce chapitre, tu dois savoir :

L'essentiel : Prouver la dichotomie Extrait gratuit

Un extrait de la fiche « L'essentiel » du chapitre. Les démonstrations sont dans le cours détaillé.

À retenir Variant et invariant de la dichotomie
  • Variant : d−g+1d - g + 1, nombre de cases de la zone ; entier positif tant que g≤dg \le d, il diminue d'au moins 1 à chaque tour. d−gd - g est aussi un variant (positif ou nul à l'entrée de chaque tour), mais pas « positif pendant toute l'exécution » : il vaut -1 à la sortie.
  • Invariant : les éléments d'indice <g< g sont <x< x, ceux d'indice >d> d sont >x> x. Donc, si xx est dans la liste, son indice est entre gg et dd.
  • Tours : au plus ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1 ; 10 pour 1000 éléments, 20 pour 10610^6. La version récursive du chapitre Récursivité fait au plus 21 appels pour 10610^6 : 20 avec comparaison, plus l'appel final sur une zone vide.
  • Précondition : liste triée.

Une méthode du chapitre Extrait gratuit

Un exercice corrigé Extrait gratuit

Dans le chapitre complet

Le cours détaillé, toute la fiche « L'essentiel », 18 méthodes, 21 pièges corrigés, la carte mentale, 35 exercices corrigés, 3 problèmes de concours, les fiches à mémoriser et l'assistant qui répond à tes questions. Les trois premiers chapitres de chaque matière sont offerts avec un compte d’essai gratuit.

Ouvrir l'essai gratuit

Plan du cours

Les méthodes du chapitre

Chaque méthode est une fiche : quand l'utiliser, le rappel de cours, les étapes, la rédaction attendue sur la copie, un exemple traité, les erreurs à éviter.

  1. Créer une liste adaptée ; créer, parcourir et copier une grille
  2. Prévoir l'effet d'une affectation, d'une copie ou d'un appel
  3. Choisir le parcours, et construire une nouvelle liste
  4. Chercher un élément avec une sortie anticipée
  5. Renvoyer une position, ou -1
  6. Calculer un extremum, sa position, un second maximum
  7. Compter des occurrences
  8. Comparer les paires avec deux boucles imbriquées
  9. Écrire une dichotomie itérative sans erreur d'indice
  10. Adapter la dichotomie
  11. Dérouler une dichotomie à la main
  12. Justifier la terminaison et la correction d'une recherche
  13. Évaluer un coût et l'écrire avec la notation OO
  14. Écrire un jeu de tests pour une recherche
  15. Relire un code de recherche et trouver l'erreur
  16. Résoudre f(x)=0f(x) = 0 par dichotomie
  17. Employer les méthodes des listes et la copie profonde
  18. Donner le meilleur cas et le pire cas d'une recherche

Les exercices corrigés

Chaque exercice a ses indications, sa correction rédigée et ce qu'il faut en retenir.

Application directe (14)

Entraînement (17)

Approfondissement (4)

Les problèmes de concours

Des extraits de sujets réels, corrigés en entier, avec la durée conseillée et les méthodes mobilisées.

Questions fréquentes

Comment écrire une recherche dichotomique en Python ?

La zone de recherche va de l'indice g à l'indice d, compris : au départ g = 0 et d = len(L) - 1. Tant que g <= d, on calcule le milieu m = (g + d) // 2 ; si L[m] == x, on renvoie m ; si L[m] < x, on continue à droite avec g = m + 1 ; sinon, à gauche avec d = m - 1. Après la boucle, on renvoie -1. Le milieu se calcule avec //, car un flottant n'est pas un indice. La liste doit être triée : c'est une précondition, que la fonction ne vérifie pas. Si plusieurs éléments valent x, elle renvoie l'indice de l'un d'eux, pas forcément le premier.

Quelle est la complexité de la recherche dichotomique ?

Sur une liste de n≥1n \geq 1 éléments, elle fait au plus ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1 tours : 10 pour 1000 éléments, 20 pour un million, 30 pour un milliard. Son coût est logarithmique, en O(log⁡n)O(\log n). La recherche séquentielle fait au pire nn tours, quand la valeur est absente ou en dernière position : son coût est linéaire, en O(n)O(n). Le prix de la dichotomie est que la liste doit être triée ; trier coûte plus qu'une recherche séquentielle, et l'on trie une fois quand on doit ensuite chercher souvent.

Quel est le variant et l'invariant de la recherche dichotomique ?

Le variant est d−g+1d - g + 1, le nombre de cases de la zone : c'est un entier strictement positif tant que g <= d, et il diminue d'au moins 1 à chaque tour, puisque le milieu examiné est retiré de la zone. d−gd - g convient aussi, car il est positif ou nul à l'entrée de chaque tour, même s'il vaut −1-1 à la sortie. L'invariant est : les éléments d'indice inférieur à gg sont strictement plus petits que xx, ceux d'indice supérieur à dd strictement plus grands. À la sortie de la boucle, g=d+1g = d + 1 : aucun élément ne vaut xx, et renvoyer −1-1 est juste.

Pourquoi M = L ne copie pas une liste en Python ?

M = L donne deux noms à une seule liste : modifier M[0] modifie L[0]. Pour obtenir une nouvelle liste, on écrit L[:] ou [x for x in L] ; c'est une copie superficielle, qui partage les sous-listes. Une grille se crée par [[0] * p for i in range(n)], jamais par [[0] * p] * n, qui répète nn fois la même ligne. Une fonction ne modifie la liste reçue que si sa spécification le dit. Au programme marocain, copy.deepcopy(L) copie tous les niveaux.

Comment chercher un élément dans une liste Python sans utiliser in ?

On écrit une recherche séquentielle : for i in range(len(L)), et return i dès que L[i] == x ; après la boucle, return -1. Pour un simple test d'appartenance, une boucle while i < len(L) and L[i] != x avance i, puis l'on renvoie i < len(L). L'expression x in L fait la même recherche, au même coût, jusqu'à len(L) comparaisons ; quand un sujet demande d'écrire la recherche, on écrit la boucle. En France, x in L sur une liste n'est utilisable qu'avec la documentation du sujet.

Combien coûtent les opérations sur une liste Python ?

L[i], L[i] = v, len(L) et L.pop() ont un coût constant, et L.append(x) un coût constant en moyenne. Une tranche, une copie, la concaténation +, le test x in L et la comparaison L1 == L2 coûtent un temps proportionnel au nombre d'éléments recopiés ou comparés. Écrire L = L + [x] dans une boucle de nn tours recopie n(n−1)/2n(n - 1)/2 éléments : le coût est quadratique, alors qu'avec L.append(x) il est linéaire pour la boucle entière. Au programme marocain, insert, remove, pop(i), index et count ont un coût linéaire.

Comment y accéder

Ce chapitre fait partie de l'accès complet. Les trois premiers chapitres de chaque matière (deux par bloc en économie et droit, en management et gestion) sont offerts avec un compte d'essai gratuit. Créer un compte d'essai ou se connecter. Pour l'accès complet, les tarifs ou une question, écris-nous sur WhatsApp.

Toute ta prépa au même endroit

Pour chaque chapitre : le cours, l'essentiel, les méthodes, les pièges, les exercices corrigés, les problèmes de concours, et un assistant qui répond à tes questions. Programmes du Maroc et de France. Avec la plateforme vidéo YOUNESS SCHOOL offerte, dès 600 DH (60 $) par mois, sans engagement.

Prépas scientifiques : voir l'offrePrépas ECS et ECT : voir l'offreTu hésites encore ? Essaie gratuitement Prepa Help.

← Spécifier, tester, prouver : terminaison et correction · Chaînes de caractères et algorithmes sur les textes →