Adloun

Les sommes cumulées, et les requêtes en temps constant

Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Parcours de listes et coût

Énoncé

Écrire cumul(L) renvoyant la liste telle que , puis somme_tranche(C, i, j) qui rend sans boucle. Justifier la formule et comparer le coût de requêtes avec et sans prétraitement.

Corrigé

Le code.

def cumul(L):
    C = []
    total = 0
    for x in L:
        total = total + x
        C.append(total)
    return C

def somme_tranche(C, i, j):
    # somme des L[i] a L[j] inclus, en temps constant
    if i == 0:
        return C[j]
    return C[j] - C[i - 1]

L = [3, 1, 4, 1, 5, 9, 2, 6]
C = cumul(L)
print(C)                          # [3, 4, 8, 9, 14, 23, 25, 31]
print(somme_tranche(C, 2, 5))     # 4 + 1 + 5 + 9 = 19

La formule. Par construction, et . En soustrayant, tous les termes d'indice inférieur à se compensent :

C'est un télescopage, le même mécanisme que celui des séries : une somme de tranche s'obtient comme différence de deux sommes depuis le début.

Le cas est à traiter à part. L'indice vaudrait alors , et en Python C[-1] désigne le dernier élément de la liste : la fonction renverrait , un résultat faux, souvent négatif, et sans le moindre message d'erreur. C'est le piège de cet exercice.

Vérification sur l'exemple. , et . ✔

Le coût. Sans prétraitement, chaque requête demande de parcourir la tranche, soit jusqu'à additions ; requêtes coûtent donc de l'ordre de opérations. Avec le prétraitement, on paie opérations une fois, puis chaque requête coûte une soustraction : total de l'ordre de .

Sur et , cela fait opérations contre : plusieurs minutes contre une fraction de seconde. C'est le principe du prétraitement — investir un parcours pour rendre les interrogations suivantes immédiates.

À noter. La bibliothèque numpy propose np.cumsum(L), qui produit exactement la liste . La programmer soi-même une fois éclaire ce qu'elle fait ; l'utiliser ensuite est parfaitement légitime.

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.