Adloun

La mémoire, ligne par ligne

Exercice · informatique (tronc commun des prépas scientifiques), chapitre 18 — La programmation dynamique

Énoncé

(a) Optimiser le calcul de Fibonacci pour n'utiliser qu'un espace mémoire en . (b) Modifier l'implémentation de la distance de Levenshtein pour qu'elle s'exécute en n'utilisant que deux lignes de tableau, amenant l'espace mémoire à . (c) Expliquer ce que cette optimisation de l'espace mémoire sacrifie et comment y remédier si nécessaire.

Corrigé

(a)

def fib_optimal(n: int) -> int:
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

(b)

def levenshtein_2lignes(u: str, v: str) -> int:
    if len(v) > len(u):
        u, v = v, u  # Assure que v est la chaîne la plus courte
    prec = list(range(len(v) + 1))
    for i in range(1, len(u) + 1):
        cour = [i] + [0] * len(v)
        for j in range(1, len(v) + 1):
            cout = 0 if u[i - 1] == v[j - 1] else 1
            cour[j] = min(prec[j] + 1,          # suppression
                          cour[j - 1] + 1,      # insertion
                          prec[j - 1] + cout)   # substitution
        prec = cour
    return prec[len(v)]

(c) Cette réduction d'espace mémoire sacrifie la possibilité de reconstruire la solution optimale (la suite des opérations d'édition). On ne conserve que la valeur finale de la distance. Si l'on souhaite à la fois économiser la mémoire et reconstruire la solution, il faut utiliser des approches de type "diviser pour régner" (comme l'algorithme de Hirschberg, hors programme) qui reconstruisent la solution en mémoire linéaire au prix d'un doublement du temps de calcul.

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.