Adloun

É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'à :

1237816
tours122345

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.