Chercher dans l'infini — la recherche par doublement
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 5 — Algorithmes dichotomiques
Énoncé
Soit une suite infinie strictement croissante définie par une fonction u(i). On cherche l'indice d'une valeur . Proposer un algorithme de complexité (où est la position attendue) sans connaître à l'avance de borne supérieure sur l'indice.
Corrigé
On procède en deux phases :
- Phase de doublement : On cherche une borne supérieure en évaluant la fonction aux indices puissances de 2 () jusqu'à trouver un indice tel que . Cette étape prend étapes.
- Phase de dichotomie : On sait alors que se trouve dans l'intervalle avec . On effectue une recherche dichotomique classique sur cet intervalle de largeur , ce qui prend également opérations.
def recherche_infinie(u, v):
if u(0) == v:
return 0
if u(0) > v:
return None
# Phase 1 : Trouver la borne supérieure
d = 1
while u(d) < v:
d = d * 2
# Phase 2 : Recherche dichotomique sur la fenêtre trouvée [d // 2, d]
g = d // 2
while g <= d:
m = (g + d) // 2
val_m = u(m)
if val_m == v:
return m
elif val_m < v:
g = m + 1
else:
d = m - 1
return None
La complexité globale est bien en .
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.