Adloun

Le sous-tableau de somme maximale, version quadratique

Exercice · informatique (tronc commun des prépas scientifiques), chapitre 3 — Boucles imbriquées et complexité quadratique

Énoncé

Écrire une fonction meilleure_tranche(t) de complexité renvoyant la somme maximale d'une tranche non vide (), sans recalculer les sommes partielles depuis le début à chaque étape.

Corrigé

L'astuce consiste à remarquer que la somme de la tranche est égale à la somme de à laquelle on ajoute la valeur . On accumule la somme dans une variable locale lors du parcours interne :

def meilleure_tranche(t: list) -> float:
    """Précondition : t est non vide."""
    meilleur = t[0]
    for i in range(len(t)):
        s = 0
        for j in range(i, len(t)):
            s += t[j] # s est la somme accumulée de t[i..j]
            if s > meilleur:
                meilleur = s
    return meilleur

assert meilleure_tranche([2, -8, 3, -2, 4, -10]) == 5 # tranche [3, -2, 4]
assert meilleure_tranche([-3, -1, -7]) == -1          # cas des valeurs toutes négatives

Cette accumulation permet de descendre le coût de (calcul naïf) à .

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.