Adloun

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 :

  1. 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.
  2. 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.