Dérouler dichotomie sur 1, 3, 5, 7, 9, 11 en cherchant, puis
Exercice de TD · niveau 2 · NSI (première), chapitre 8 — Dichotomie, voisins et gloutons · La recherche dichotomique
É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.
| tour | `gauche` | `droite` | `milieu` | ||
|---|---|---|---|---|---|
| 1 | 0 | 5 | 2 () | 6 | |
| 2 | 3 | 5 | 4 () | 3 | |
| 1 | 0 | 5 | 2 () | 6 | |
| 2 | 0 | 1 | 0 () | 2 | |
| 3 | 1 | 1 | 1 () | 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.
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.