Écrire une fonction qui compte les tours de la dichotomie dans le pire…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 8 — Dichotomie, voisins et gloutons · Variantes de la dichotomie
Énoncé
Écrire une fonction qui compte les tours de la dichotomie dans le pire cas pour un tableau de taille , et retrouver expérimentalement .
Corrigé
def nb_tours(n):
"""Nombre de tours dans le PIRE cas : une valeur absente, plus grande que
toutes les autres -- la dichotomie va alors toujours vers la droite."""
gauche, droite, tours = 0, n - 1, 0
while gauche <= droite:
tours += 1
gauche = (gauche + droite) // 2 + 1
return tours
for n in [1, 2, 3, 7, 8, 15, 16, 1000, 1024, 10**6]:
assert nb_tours(n) == n.bit_length()
Le pire cas se choisit, il ne se tire pas au hasard. Chercher une valeur plus grande que toutes les autres force la branche gauche = milieu + 1 à chaque tour : c'est le chemin le plus long. Une valeur tirée au hasard donnerait un nombre de tours moyen, plus petit, et l'égalité avec bit_length disparaîtrait.
On n'a même plus besoin du tableau. La fonction ne manipule que gauche et droite : le contenu n'intervient pas dans le comptage. C'est une remarque de fond sur la complexité — elle ne dépend que de la taille, pas des valeurs.
Le tableau des mesures, jusqu'à :
| 1 | 2 | 3 | 7 | 8 | 16 | |
|---|---|---|---|---|---|---|
| tours | 1 | 2 | 2 | 3 | 4 | 5 |
Le saut a lieu aux puissances de deux — de à , de à : exactement là où le nombre de bits augmente.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.