Adloun

NSI (première) · Chapitre 8 · Exercice de TD

Dérouler dichotomie sur 1, 3, 5, 7, 9, 11 en cherchant, puis

Dichotomie, voisins et gloutons · La recherche dichotomique · niveau 2

Énoncé

Dérouler dichotomie sur [1, 3, 5, 7, 9, 11] en cherchant , puis . Noter à chaque tour gauche, droite, milieu et la valeur du variant. Vérifier que le variant décroît strictement.

Corrigé

Les deux traces. Le variant est , le nombre d'indices encore candidats.

tourgauchedroitemilieu
1052 ()6
2354 ()3
1052 ()6
2010 ()2
3111 ()1

Pour : la fonction renvoie au deuxième tour. Pour : après le troisième tour, , la boucle s'arrête et la fonction renvoie .

Le variant décroît bien strictement : puis . Il ne décroît pas régulièrement de moitié — de à , puis de à : la division entière fait que la coupe n'est pas toujours équilibrée. Ce que la démonstration exige, ce n'est pas « est divisé par deux » mais « diminue d'au moins » ; c'est plus faible, et cela suffit à conclure.

La trace, obtenue par la machine. Plutôt que de recopier à la main, on instrumente la fonction :


def dichotomie_tracee(t, v):
    """Meme algorithme, mais qui renvoie AUSSI la trace des tours."""
    gauche, droite = 0, len(t) - 1
    trace = []
    while gauche <= droite:
        milieu = (gauche + droite) // 2
        trace.append((gauche, droite, milieu, t[milieu], droite - gauche + 1))
        if t[milieu] == v:
            return milieu, trace
        elif t[milieu] < v:
            gauche = milieu + 1
        else:
            droite = milieu - 1
    return -1, trace

t = [1, 3, 5, 7, 9, 11]
assert dichotomie_tracee(t, 9) == (4, [(0, 5, 2, 5, 6), (3, 5, 4, 9, 3)])

r, tr = dichotomie_tracee(t, 4)
assert r == -1
variants = [x[4] for x in tr]
assert variants == [6, 2, 1]
assert all(variants[i] > variants[i + 1] for i in range(len(variants) - 1))

Le dernier assert est la propriété du variant, écrite en Python : une suite strictement décroissante. C'est le seul du lot qui resterait pertinent si l'on changeait le tableau.

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →